diff --git a/freecad/asm3/assembly.py b/freecad/asm3/assembly.py index 2bb6b2f..6e43cdd 100644 --- a/freecad/asm3/assembly.py +++ b/freecad/asm3/assembly.py @@ -1594,7 +1594,7 @@ def getElementInfo(parent,subname, # no element object here. part = (part[0],idx,part[1],True) pla = part[0].Placement.multiply(plaList[idx]) - except ValueError: + except Exception: raise RuntimeError('invalid array subname of element ' '{}: {}'.format(objName(parent),subnameRef)) @@ -1800,6 +1800,17 @@ class AsmElementLink(AsmBase): def getAssembly(self): return self.parent.parent.parent + def getLinkedElement(self): + 'Get linked AsmElement object' + link = self.Object.LinkedObject + if not isinstance(link,tuple): + linked = link + else: + linked = link[0].getSubObject(link[1],1) + if not linked: + raise RuntimeError('broken link') + return linked + def getElementSubname(self,recursive=False): 'Resolve element link subname' @@ -2744,7 +2755,17 @@ class AsmConstraint(AsmGroup): setLinkProperty(info.Part,'ShowElement',False) try: setLinkProperty(info.Part,'ElementCount',1) + + # adjust the first element to point to the first array + # element. 'elements[0]' is an AsmElementLink, so follow its + # link first to obtain the AsmElement, and then change its + # subname reference + element = elements[0].Proxy.getLinkedElement() + link = element.LinkedObject + if isinstance(link, tuple): + element.setLink(link[0], '0.' + link[1]) except Exception: + logger.error(traceback.format_exc()) raise RuntimeError('Failed to change element count of ' '{}'.format(info.PartName)) diff --git a/freecad/asm3/utils.py b/freecad/asm3/utils.py index 165d79c..567b29e 100644 --- a/freecad/asm3/utils.py +++ b/freecad/asm3/utils.py @@ -77,7 +77,10 @@ def addIconToFCAD(iconFile,path=None): def objName(obj): try: - return getattr(obj,'FullName',obj.Name) + name = getattr(obj,'FullName',obj.Name) + if obj.Label != obj.Name: + name = '%s (%s)' % (name, obj.Label) + return name except Exception: return '?'