Quota angolare con python


#1

non trovando un “AddAngularDimension” mi sono lanciato sul rs.command…

ma non riesco a definire la posizione della quota angolare a metà della lineaA

rs.Command("_DimAngle " + "SelID " + str(lineaA) + " SelID " + str(lineaB) + " " )

Qualcuno cortesemente mi aiuta?


#2

ciao Enzo,
vedi se il risultato che desideri è questo?

import rhinoscriptsyntax as rs
lineaA = rs.GetObject(“Seleziona Prima Linea”,4)
lineaB = rs.GetObject(“Seleziona Seconda Linea”,4)
rs.Command("_DimAngle " + "_SelID " + str(lineaA) + " _SelID " + str(lineaB))

Salvio.


#3

ciao Salvio,
Quello che sto cercando di ottenere è che la quota angolare si “fissi” da sola sulla metà della prima linea
invece che doverla posizionare io manualmente.

non capisco come specificare questo punto dopo aver indicato le due linee usando rs.command


#4

rs.Command("_DimAngle " + "_SelID " + str(lineaA) + " _SelID " + str(lineaB) + " " + str(rs.CurveMidPoint(lineaA)))

prova sostituendo l’ultima riga con questa e fammi sapere :ok_hand:


#5

Ciao Enzo

Gia’ … il nostro terrificante amico rs.Command() …
Ho provato anch’io, ma senza successo, quindi, parafrasando quanto dici tu …

Non riuscendo ad usare rs.Command, mi sono lanciato su AddAngularDimension … :wink:

Ho provato a scrivere un AddAngularDimension, purtroppo in fretta e furia, come sempre …

import Rhino
import scriptcontext
import rhinoscriptsyntax as rs

def AddAngularDimension( LineA, LineB, PointOrRadius, SmallerAngle = None ):
  '''
  add an angular dimension
  from Guids of 2 lines ( LineA, LineB ):
  from a point on the dimension arc or a radius ( PointOrAngle ):
  from a flag to pick either the smaller or the larger angle ( SmallerAngle ):
      True: draw the smaller angle
      False: draw the larger angle
      None: pick the angle from the point in PointOrRadius
  -> Guid or None
  '''
  cua = Rhino.DocObjects.ObjRef( LineA ).Curve()
  cub = Rhino.DocObjects.ObjRef( LineB ).Curve()
  lia = Rhino.Geometry.Line( cua.PointAtStart, cua.PointAtEnd )
  lib = Rhino.Geometry.Line( cub.PointAtStart, cub.PointAtEnd )
  ok, ua, ub = Rhino.Geometry.Intersect.Intersection.LineLine( lia, lib )
  if not ok:
    return None
  cen = lia.PointAt( ua )
  if isinstance( PointOrRadius, float ):
    rad = PointOrRadius
  elif isinstance( PointOrRadius, list ):
    pnt = rs.coerce3dpoint( PointOrRadius )
    rad = pnt.DistanceTo( cen )
  elif isinstance( PointOrRadius, Rhino.Geometry.Point3d ):
    rad = PointOrRadius.DistanceTo( cen )
  else:
    return None
  lia = Rhino.Geometry.Line( cen, ( lia.From + lia.To ) / 2.0 )
  lib = Rhino.Geometry.Line( cen, ( lib.From + lib.To ) / 2.0 )
  vea = lia.Direction
  vea.Unitize()
  veb = lib.Direction
  veb.Unitize()
  bis = vea + veb
  if bis.IsTiny( 1.0e-9 ):
    bis.PerpendicularTo( vea )
  bis.Unitize()
  if SmallerAngle is None:
    pnt = rs.coerce3dpoint( PointOrRadius )
    if not pnt:
      return None
    vec = pnt - cen
    if ( vec * bis ) < 0.0:
      bis.Reverse()
  elif not SmallerAngle:
    bis.Reverse()
  pa = cen + ( vea * rad )
  pb = cen + ( bis * rad )
  pc = cen + ( veb * rad )
  arc = Rhino.Geometry.Arc( pa, pb, pc )
  offset = rs.DimStyleOffset( rs.CurrentDimStyle() )
  adim = Rhino.Geometry.AngularDimension( arc, offset )
  gid = scriptcontext.doc.Objects.AddAngularDimension( adim )
  scriptcontext.doc.Views.Redraw()
  return gid

def main():
  ida = rs.GetObject( 'Line A ?' )
  idb = rs.GetObject( 'Line B ?' )
  pnt = rs.GetPoint( 'Point ?' )
  angdim = AddAngularDimension( ida, idb, pnt )

main()

Ho fatto solo una prova. :blush:
Spero si capisca qualcosa.
Vuole le due linee e un punto per cui far passare la quota.
In alternativa al punto puoi dargli un raggio ( non testato )
C’e’ un ultimo parametro opzionale (non testato)
che dovrebbe consentire di scegliere se quotare l’angolo minore o quello maggiore,
di default dovrebbe scegliere l’angolo passante per il punto (parametro precedente).

Se usi la funzione AddAngularDimension() in uno script, ricordati di importare anche i moduli Rhino e scriptcontext oltre a rhinoscriptsyntax

import rhinoscriptsyntax as rs
import Rhino
import scriptcontext

I test sono benvenuti.
Il debugging ancora di piu’ … :wink:
( Non so quando riusciro’ a correggere gli errori gentilmente riportati … )

Grazie, ciao !


#6

import rhinoscriptsyntax as rs

PTa = rs.GetPoint(message=“punto A”)
PTb = rs.GetPoint(message=“punto B”)
lineaA = rs.AddLine(PTa, PTb)
PTc = rs.GetPoint(message=“punto C”)
lineaB = rs.AddLine(PTb, PTc)
quota1 = rs.Command("_DimAngle " + "_SelID " + str(lineaA) + " _SelID " + str(lineaB) + " " + str(rs.CurveMidPoint(lineaA)))

il “CurveMidPoint” mi era proprio sfuggito! anche se a me non piazza la quota a metà della linea, la maggior parte delle volte la mette all’inizio della prima linea

grazie per il suggerimento @0904


#7

Questa versione è decisamente completa di tutte le opzioni…

l’unica cosa che non mi torna è la dimensione dello stile di quota, ne esce una quota molto piccola.

comunque grazie @emilio


#8

Non mi serve, ma spetta che lo provo… e se trovo qualcosa che non funziona… mi metto a sproloquiare :slight_smile:


#9

Non ho ancora provato, ma presumo che prenda lo stile di quota di default (lo dovresti poter selezionare al momento di inserire una quota oppure nelle opzioni dove ci sono tutti gli stili).


#10

ho solo lo stile di quota di default, la quota dello script è quella piccola, se quoto l’angolo con l’apposito comando ne esce il testo grande


#11

Grazie Enzo :slight_smile:

Provero’ a sistemarlo …


#12

Praticamente si porta dietro uno stile testo sbagliato…
Il resto funziona tutto ma la quota normale presenta un testo “override”… però credo sia un bug di Rhino.
Ho fatto una prova:

  • Aperto un file nuovo senza nulla
  • Disegnato due linee
  • Fatto la quota angolare con lo stile Default
  • Seleziono la quota e mi dice che il testo è di tipo “Varies”

    Non mi pare una roba fatta bene…
    Probabilmente anche lo script, quando va a leggere lo stile di quota attuale, passa un parametro quota diverso da quello standard e, quindi, la quota diventa di tipo “override” e non si aggiorna come quelle standard.

#13

grazie a te @emilio, ora credo di aver capito la “filosofia” di scriptare, in cui bisogna non solo mettere in fila alcuni comandi, ma anche gestire opzioni e possibili problemi!

non si finisce mai di imparare…


#14
import Rhino
import scriptcontext
import rhinoscriptsyntax as rs

def AddAngularDimension( LineA, LineB, PointOrRadius, SmallerAngle = None ):
  '''
  add an angular dimension
  from Guids of 2 lines ( LineA, LineB ):
  from a point on the dimension arc or a radius ( PointOrAngle ):
  from a flag to pick either the smaller or the larger angle ( SmallerAngle ):
      True: draw the smaller angle
      False: draw the larger angle
      None: pick the angle from the point in PointOrRadius
  -> Guid or None
  '''
  cua = Rhino.DocObjects.ObjRef( LineA ).Curve()
  cub = Rhino.DocObjects.ObjRef( LineB ).Curve()
  lia = Rhino.Geometry.Line( cua.PointAtStart, cua.PointAtEnd )
  lib = Rhino.Geometry.Line( cub.PointAtStart, cub.PointAtEnd )
  ok, ua, ub = Rhino.Geometry.Intersect.Intersection.LineLine( lia, lib )
  if not ok:
    return None
  cen = lia.PointAt( ua )
  if isinstance( PointOrRadius, float ):
    rad = PointOrRadius
  elif isinstance( PointOrRadius, list ):
    pnt = rs.coerce3dpoint( PointOrRadius )
    rad = pnt.DistanceTo( cen )
  elif isinstance( PointOrRadius, Rhino.Geometry.Point3d ):
    rad = PointOrRadius.DistanceTo( cen )
  else:
    return None
  lia = Rhino.Geometry.Line( cen, ( lia.From + lia.To ) / 2.0 )
  lib = Rhino.Geometry.Line( cen, ( lib.From + lib.To ) / 2.0 )
  vea = lia.Direction
  vea.Unitize()
  veb = lib.Direction
  veb.Unitize()
  bis = vea + veb
  if bis.IsTiny( 1.0e-9 ):
    bis.PerpendicularTo( vea )
  bis.Unitize()
  if SmallerAngle is None:
    pnt = rs.coerce3dpoint( PointOrRadius )
    if not pnt:
      return None
    vec = pnt - cen
    if ( vec * bis ) < 0.0:
      bis.Reverse()
  elif not SmallerAngle:
    bis.Reverse()
  pa = cen + ( vea * rad )
  pb = cen + ( bis * rad )
  pc = cen + ( veb * rad )
  arc = Rhino.Geometry.Arc( pa, pb, pc )
  offset = rs.DimStyleOffset( rs.CurrentDimStyle() )
  adim = Rhino.Geometry.AngularDimension( arc, offset )
  gid = scriptcontext.doc.Objects.AddAngularDimension( adim )
  if not gid:
    return None
  rs.DimensionStyle( gid, rs.CurrentDimStyle() )
  scriptcontext.doc.Views.Redraw()
  return gid

def main():
  ida = rs.GetObject( 'Line A ?' )
  idb = rs.GetObject( 'Line B ?' )
  pnt = rs.GetPoint( 'Point ?' )
  angdim = AddAngularDimension( ida, idb, pnt )

main()

Gia’ … se questi sono i problemi che abbiamo noi con i nostri micro-script …
Figurati cosa capita ai ragazzi di McNeel, che scrivono Rhino tutto intero … :open_mouth: :smile:


#15

Graze @emilio, ora abbiamo un “AddAngularDimension”.

grazie anche ad @0904 e @lucio_zadra!


#16

Figurati !

… Ma e’ cambiato qualcosa con l’ultima versione ? :slight_smile:


#17

ora mi sembra funzioni corretamente!


#18

nell’ottica di un lavoro coi fiocchi, è possibile aggiungere questa nuova definizione nella libreria???

così @emilio diventerà uno di loro!!!:stuck_out_tongue_winking_eye:


#19

Ciao Emi,
il testo risulta sempre con font “personalizzato”.
Esiste un comando per resettare gli override della quota?
Non riesco a trovare na mazza sulle funzioni python… come fai a trovare quello che ti serve?


#20

Grazie per l’info.

A quanto ne so, Rhino legge rhinoscriptsyntax da qui (sul PC che sto usando )

C:\Users\Pc\AppData\Roaming\McNeel\Rhinoceros\6.0\Plug-ins\IronPython (814d908a-e25c-493d-97e9-ee3861957f49)\settings\lib\rhinoscript

… e dalla cartella ‘esterna’.

Se vuoi, puoi editare un file e aggiungere la funzione.
O salvare la funzione in un nuovo file e aggiungerlo agli import del file rhnioscriptsyntax.

Se vuoi, dicevo, ma e’ una cosa da fare a tuo rischio e pericolo. :slight_smile:
Tieni conto che e’ roba non testata …

Ciao !

P.S.

( emilio sta solo cercando di arrivare un qualche modo alla pensione … ammesso che poi nel caso arrivi, la pensione …)