Script Python Stregato

Per gli scriptomani
Qui sotto è allegato uno script in Python che si comporta in modo strano. Lo script mette le quote (lungo X o lungo Y) dei lati di una polylinea come nell’immagine allegata o qualsiasi altra.
Se clicco la il lato vicino allo spigolo( cerchio rosso) mi mette la quota esattamente se clicco il lato in posizione centrale (cerchio verde) mette la quota tra un estremo e il punto dove ho cliccato come nell’immagine allegata.
Cosa ulteriormente strana è che: chiudo Rhino e lo riapro , disegno una polylinea , lancio lo script e clicco su un lato lontano dallo spigolo mette la quota precisa la prima volta e successivamente torna il casino di prima.
Vorrei che qualcuno lo provasse per vedere cosa succede su altri computer.
Ciao Vittorio

import Rhino
import rhinoscriptsyntax as rs
import scriptcontext


def GetCurvesAndEdges():
    """
    Return segmento di polylinea , linea, edge
    """
    filter= Rhino.DocObjects.ObjectType.Curve    
    rc, objrefs = Rhino.Input.RhinoGet.GetOneObject("Seleziona segmento o edge da quotare", False, filter)
    if rc != Rhino.Commands.Result.Success: return rc 
    pp=Rhino.DocObjects.ObjRef.CurveParameter(objrefs)    
    print "c",objrefs.Curve()    
    pt=objrefs.SelectionPoint()   
    #rs.AddPoint(pt)
    a=Rhino.Geometry.Curve.DuplicateSegments(objrefs.Curve())    
    if len(a)==0:
        segmento=scriptcontext.doc.Objects.AddCurve(objrefs.Curve())
        return segmento
    cc=[]    
    for i in a:
        seg=scriptcontext.doc.Objects.AddCurve(i)        
        param=rs.CurveClosestPoint(seg,pt)
        cp=rs.EvaluateCurve(seg,param)
        if rs.PointCompare(pt,cp,0.0001):
            segmento=seg             
        else:
            cc.append(seg)    
    rs.DeleteObjects(cc)
    return segmento
    
cc=GetCurvesAndEdges()

if rs.IsLine(cc):
    ps=rs.CurveStartPoint(cc)
    pe=rs.CurveEndPoint(cc)
    #rs.AddPoints((ps,pe))
    p1=rs.coerce3dpoint(ps)      
    p2=rs.coerce3dpoint(pe)
    rs.AddPoints((p1,p2))    
    rs.DeleteObject(cc)       
    rs.Command("Dim W"+str(p1)+" W"+str(p2))

Problema risolto .

import Rhino
import rhinoscriptsyntax as rs
import scriptcontext


def GetCurvesAndEdges():
    """
    Return segmento di polylinea , linea, edge
    """
    filter= Rhino.DocObjects.ObjectType.Curve    
    rc, objrefs = Rhino.Input.RhinoGet.GetOneObject("Seleziona segmento o edge da quotare", False, filter)
    if rc != Rhino.Commands.Result.Success: return rc 
    pp=Rhino.DocObjects.ObjRef.CurveParameter(objrefs)    
    print "c",objrefs.Curve()    
    pt=objrefs.SelectionPoint()   
    #rs.AddPoint(pt)
    a=Rhino.Geometry.Curve.DuplicateSegments(objrefs.Curve())    
    if len(a)==0:
        segmento=scriptcontext.doc.Objects.AddCurve(objrefs.Curve())
        return segmento
    cc=[]    
    for i in a:
        seg=scriptcontext.doc.Objects.AddCurve(i)        
        param=rs.CurveClosestPoint(seg,pt)
        cp=rs.EvaluateCurve(seg,param)
        if rs.PointCompare(pt,cp,0.001):
            segmento=seg
            print "seg",segmento
        else:
            cc.append(seg)    
    
    #rs.MessageBox(segmento)
    rs.UnselectAllObjects()
    #if rs.IsLine(segmento):
    rs.SelectObject(segmento)
    
    rs.Command("_Dim _Object")
    rs.DeleteObject(segmento) 
    rs.DeleteObjects(cc)
GetCurvesAndEdges()

Vittorio

Ho trovato l’errore. Lo script allegato ora funziona
Vittorio
QuotaToccandoSegmentoPolylinea.py (1,5 KB)

1 Mi Piace

Grazie Vittorio, bel lavoro