From 1a96bb280568cd766e357967cb31eb2e58300322 Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Tue, 9 Apr 2019 13:00:16 +0800 Subject: [PATCH] Fix handling of infinite line Fixes #222 --- constraint.py | 11 +++++++---- utils.py | 19 ++++++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/constraint.py b/constraint.py index fe79d0b..ee4bfe7 100644 --- a/constraint.py +++ b/constraint.py @@ -180,8 +180,8 @@ def _l(solver,partInfo,subname,shape,retAll=False): system.log('cache {}: {}',key,h) else: nameTag = partInfo.PartName + '.' + key + v = utils.getVertexes(shape) if utils.isDraftWire(part): - v = shape.Edge1.Vertexes vname1,vname2 = utils.edge2VertexIndex(part,subname) if not vname1: raise RuntimeError('Invalid draft subname {} or {}'.format( @@ -189,9 +189,12 @@ def _l(solver,partInfo,subname,shape,retAll=False): tp0 = _p(solver,partInfo,vname1,v[0]) tp1 = _p(solver,partInfo,vname2,v[1]) else: - v = shape.Edge1.Vertexes system.NameTag = nameTag + 'p0' - p0 = system.addPoint3dV(*v[0].Point) + try: + p0 = system.addPoint3dV(*v[0].Point) + except Exception: + logger.info(system.NameTag) + raise system.NameTag = nameTag + 'p0t' tp0 = system.addTransform(p0,*partInfo.Params,group=partInfo.Group) system.NameTag = nameTag + 'p1' @@ -873,7 +876,7 @@ class Locked(Base): nameTag = partInfo.PartName + '.' + info.Subname - for i,v in enumerate(info.Shape.Vertexes): + for i,v in enumerate(utils.getVertexes(info.Shape)): surfix = '.fp{}'.format(i) system.NameTag = nameTag + surfix diff --git a/utils.py b/utils.py index 2f75294..5369dfe 100644 --- a/utils.py +++ b/utils.py @@ -62,10 +62,7 @@ def objName(obj): return '?' def isLine(param): - if hasattr(Part,"LineSegment"): - return isinstance(param,(Part.Line,Part.LineSegment)) - else: - return isinstance(param,Part.Line) + return isinstance(param,(Part.Line,Part.LineSegment)) def deduceSelectedElement(obj,subname): shape = obj.getSubObject(subname) @@ -278,6 +275,16 @@ def isSphericalSurface(obj): return False return str( face.Surface ).startswith('Sphere ') +def getVertexes(shape): + v = shape.Vertexes + if v or shape.countElement('Edge')!=1: + return v + curve = shape.Edge1.Curve + if isinstance(curve,Part.Line): + return [Part.Vertex(curve.Location), + Part.Vertex(curve.Location+curve.Direction)] + return [] + def getElementPos(obj): vertex = getElementShape(obj,Part.Vertex) if vertex: @@ -308,7 +315,9 @@ def getElementPos(obj): edge = getElementShape(obj,Part.Edge) if not edge: return FreeCAD.Vector() - if isLine(edge.Curve): + if isinstance(edge.Curve,Part.Line): + return edge.Curve.Location + elif isinstance(edge.Curve,Part.LineSegment): # pos = edge.Vertexes[-1].Point return (edge.Vertex1.Point+edge.Vertex2.Point)*0.5 elif hasattr( edge.Curve, 'Center'): #circular curve