Migrate to new style FC module

This commit is contained in:
Zheng, Lei 2017-12-07 03:14:13 +08:00
parent d6510681f8
commit 176817a635
11 changed files with 75 additions and 91 deletions

View File

@ -1,31 +1 @@
import FreeCAD, FreeCADGui, Part
from asm3 import proxy,utils,gui,solver,constraint,system,assembly
from asm3.utils import logger
try:
from asm3 import sys_slvs
except ImportError as e:
logger.error('failed to import slvs: {}'.format(e))
try:
from asm3 import sys_sympy
except ImportError as e:
logger.error('failed to import sympy: {}'.format(e))
def test():
from asm3.assembly import Assembly
doc = FreeCAD.newDocument()
cylinder1 = doc.addObject('Part::Cylinder','cylinder1')
cylinder1.Visibility = False
asm1 = Assembly.make(doc)
asm1.Proxy.getPartGroup().setLink({-1:cylinder1})
cylinder2 = doc.addObject('Part::Cylinder','cylinder2')
cylinder2.Visibility = False
asm2 = Assembly.make(doc)
asm2.Placement.Base.z = -20
asm2.Proxy.getPartGroup().setLink({-1:cylinder2})
doc.recompute()
FreeCADGui.SendMsgToActiveView("ViewFit")
asm = Assembly.make(doc)
asm.Proxy.getPartGroup().setLink((asm1,asm2))
asm1.Visibility = False
asm2.Visibility = False

View File

@ -1,11 +1,10 @@
import os import os
from collections import namedtuple from collections import namedtuple
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
import asm3 from . import utils, gui
import asm3.utils as utils from .utils import logger, objName
from asm3.utils import logger, objName from .constraint import Constraint, cstrName
from asm3.constraint import Constraint, cstrName from .system import System
from asm3.system import System
def setupUndo(doc,undoDocs,name): def setupUndo(doc,undoDocs,name):
if undoDocs is None: if undoDocs is None:
@ -1006,9 +1005,10 @@ class AsmConstraint(AsmGroup):
for e in sel.Elements: for e in sel.Elements:
AsmElementLink.make(AsmElementLink.MakeInfo(cstr,*e)) AsmElementLink.make(AsmElementLink.MakeInfo(cstr,*e))
cstr.Proxy._initializing = False cstr.Proxy._initializing = False
if cstr.recompute() and asm3.gui.AsmCmdManager.AutoRecompute: from . import solver
if cstr.recompute() and gui.AsmCmdManager.AutoRecompute:
logger.catch('solver exception when auto recompute', logger.catch('solver exception when auto recompute',
asm3.solver.solve, sel.Assembly, undo=undo) solver.solve, sel.Assembly, undo=undo)
if undo: if undo:
doc.commitTransaction() doc.commitTransaction()
@ -1525,7 +1525,7 @@ class AsmMovingPart(object):
pla = info.Placement.multiply(FreeCAD.Placement(self.offset)) pla = info.Placement.multiply(FreeCAD.Placement(self.offset))
logger.trace('part move update {}: {}'.format(objName(self.parent),pla)) logger.trace('part move update {}: {}'.format(objName(self.parent),pla))
self.draggerPlacement = pla self.draggerPlacement = pla
if asm3.gui.AsmCmdManager.Trace and \ if gui.AsmCmdManager.Trace and \
self.tracePoint.isEqual(pla.Base,1e5): self.tracePoint.isEqual(pla.Base,1e5):
if not self.trace: if not self.trace:
self.trace = FreeCAD.ActiveDocument.addObject( self.trace = FreeCAD.ActiveDocument.addObject(
@ -1571,18 +1571,18 @@ class AsmMovingPart(object):
setPlacement(self.part,pla,self.undos,self._undoName) setPlacement(self.part,pla,self.undos,self._undoName)
rollback.append((self.partName,self.part,self.oldPlacement.copy())) rollback.append((self.partName,self.part,self.oldPlacement.copy()))
if not asm3.gui.AsmCmdManager.AutoRecompute: if not gui.AsmCmdManager.AutoRecompute:
# AsmCmdManager.AutoRecompute means auto re-solve the system. The # AsmCmdManager.AutoRecompute means auto re-solve the system. The
# recompute() call below is only for updating linked element and # recompute() call below is only for updating linked element and
# stuff # stuff
obj.recompute(True) obj.recompute(True)
return return
# calls asm3.solver.solve(obj) and redirect all the exceptions message # calls solver.solve(obj) and redirect all the exceptions message
# to logger only. # to logger only.
from . import solver
if not logger.catch('solver exception when moving part', if not logger.catch('solver exception when moving part',
asm3.solver.solve, solver.solve, self.objs, dragPart=self.part, rollback=rollback):
self.objs, dragPart=self.part, rollback=rollback):
obj.recompute(True) obj.recompute(True)
# self.draggerPlacement, which holds the intended dragger placement, is # self.draggerPlacement, which holds the intended dragger placement, is

View File

@ -1,9 +1,8 @@
from collections import namedtuple from collections import namedtuple
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
import asm3 from . import utils, gui
import asm3.utils as utils from .utils import objName,cstrlogger as logger, guilogger
from asm3.utils import objName,cstrlogger as logger, guilogger from .proxy import ProxyType, PropertyInfo, propGet, propGetValue
from asm3.proxy import ProxyType, PropertyInfo, propGet, propGetValue
import os import os
_iconPath = os.path.join(utils.iconPath,'constraints') _iconPath = os.path.join(utils.iconPath,'constraints')
@ -170,8 +169,9 @@ class ConstraintCommand:
return self.tp.GetResources() return self.tp.GetResources()
def Activated(self): def Activated(self):
from .assembly import AsmConstraint
guilogger.report('constraint "{}" command exception'.format( guilogger.report('constraint "{}" command exception'.format(
self.tp.getName()), asm3.assembly.AsmConstraint.make,self.tp._id) self.tp.getName()), AsmConstraint.make,self.tp._id)
def IsActive(self): def IsActive(self):
if not FreeCAD.ActiveDocument: if not FreeCAD.ActiveDocument:
@ -181,7 +181,7 @@ class ConstraintCommand:
return self._active return self._active
def checkActive(self): def checkActive(self):
from asm3.assembly import AsmConstraint from .assembly import AsmConstraint
if guilogger.catchTrace('selection "{}" exception'.format( if guilogger.catchTrace('selection "{}" exception'.format(
self.tp.getName()), AsmConstraint.getSelection, self.tp._id): self.tp.getName()), AsmConstraint.getSelection, self.tp._id):
self._active = True self._active = True
@ -202,7 +202,7 @@ class Constraint(ProxyType):
def register(mcs,cls): def register(mcs,cls):
super(Constraint,mcs).register(cls) super(Constraint,mcs).register(cls)
if cls._id>=0 and cls._menuItem: if cls._id>=0 and cls._menuItem:
asm3.gui.AsmCmdManager.register(ConstraintCommand(cls)) gui.AsmCmdManager.register(ConstraintCommand(cls))
@classmethod @classmethod
def attach(mcs,obj,checkType=True): def attach(mcs,obj,checkType=True):

27
gui.py
View File

@ -1,9 +1,8 @@
from collections import OrderedDict from collections import OrderedDict
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
import asm3 from .utils import objName,addIconToFCAD,guilogger as logger
from asm3.utils import objName,addIconToFCAD,guilogger as logger from .proxy import ProxyType
from asm3.proxy import ProxyType from .FCADLogger import FCADLogger
from asm3.FCADLogger import FCADLogger
class SelectionObserver: class SelectionObserver:
def __init__(self, cmds): def __init__(self, cmds):
@ -128,7 +127,8 @@ class AsmCmdNew(AsmCmdBase):
@classmethod @classmethod
def Activated(cls): def Activated(cls):
asm3.assembly.Assembly.make() from . import assembly
assembly.Assembly.make()
class AsmCmdSolve(AsmCmdBase): class AsmCmdSolve(AsmCmdBase):
_id = 1 _id = 1
@ -137,8 +137,9 @@ class AsmCmdSolve(AsmCmdBase):
@classmethod @classmethod
def Activated(cls): def Activated(cls):
from . import solver
logger.report('command "{}" exception'.format(cls.getName()), logger.report('command "{}" exception'.format(cls.getName()),
asm3.solver.solve) solver.solve)
class AsmCmdMove(AsmCmdBase): class AsmCmdMove(AsmCmdBase):
@ -149,11 +150,13 @@ class AsmCmdMove(AsmCmdBase):
@classmethod @classmethod
def Activated(cls): def Activated(cls):
asm3.assembly.movePart(cls._useCenterballDragger) from . import assembly
assembly.movePart(cls._useCenterballDragger)
@classmethod @classmethod
def checkActive(cls): def checkActive(cls):
cls._active = asm3.assembly.canMovePart() from . import assembly
cls._active = assembly.canMovePart()
@classmethod @classmethod
def onClearSelection(cls): def onClearSelection(cls):
@ -219,8 +222,9 @@ class AsmCmdAddWorkplane(AsmCmdBase):
@classmethod @classmethod
def checkActive(cls): def checkActive(cls):
from . import assembly
if logger.catchTrace('Add workplane selection', if logger.catchTrace('Add workplane selection',
asm3.assembly.AsmWorkPlane.getSelection): assembly.AsmWorkPlane.getSelection):
cls._active = True cls._active = True
else: else:
cls._active = False cls._active = False
@ -231,7 +235,8 @@ class AsmCmdAddWorkplane(AsmCmdBase):
@classmethod @classmethod
def Activated(cls): def Activated(cls):
asm3.assembly.AsmWorkPlane.make() from . import assembly
assembly.AsmWorkPlane.make()
class AsmCmdUp(AsmCmdBase): class AsmCmdUp(AsmCmdBase):
@ -241,7 +246,7 @@ class AsmCmdUp(AsmCmdBase):
@classmethod @classmethod
def getSelection(cls): def getSelection(cls):
from asm3.assembly import isTypeOf, Assembly, AsmGroup from .assembly import isTypeOf, Assembly, AsmGroup
sels = FreeCADGui.Selection.getSelectionEx('',False) sels = FreeCADGui.Selection.getSelectionEx('',False)
if len(sels)!=1 or len(sels[0].SubElementNames)!=1: if len(sels)!=1 or len(sels[0].SubElementNames)!=1:
return return

View File

@ -1,9 +1,19 @@
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
from .utils import logger
try:
from . import sys_slvs
except ImportError as e:
logger.error('failed to import slvs: {}'.format(e))
try:
from . import sys_sympy
except ImportError as e:
logger.error('failed to import sympy: {}'.format(e))
class Assembly3Workbench(FreeCADGui.Workbench): class Assembly3Workbench(FreeCADGui.Workbench):
import asm3 from . import utils
MenuText = 'Assembly 3' MenuText = 'Assembly 3'
Icon = asm3.utils.addIconToFCAD('AssemblyWorkbench.svg') Icon = utils.addIconToFCAD('AssemblyWorkbench.svg')
def __init__(self): def __init__(self):
self.observer = None self.observer = None
@ -12,20 +22,20 @@ class Assembly3Workbench(FreeCADGui.Workbench):
def Activated(self): def Activated(self):
self.observer.attach() self.observer.attach()
FreeCAD.addDocumentObserver(self.docObserver) FreeCAD.addDocumentObserver(self.docObserver)
from asm3.gui import AsmCmdManager from .gui import AsmCmdManager
for cmd in AsmCmdManager.getInfo().Types: for cmd in AsmCmdManager.getInfo().Types:
cmd.workbenchActivated() cmd.workbenchActivated()
def Deactivated(self): def Deactivated(self):
self.observer.detach() self.observer.detach()
FreeCAD.removeDocumentObserver(self.docObserver) FreeCAD.removeDocumentObserver(self.docObserver)
from asm3.gui import AsmCmdManager from .gui import AsmCmdManager
for cmd in AsmCmdManager.getInfo().Types: for cmd in AsmCmdManager.getInfo().Types:
cmd.workbenchDeactivated() cmd.workbenchDeactivated()
def Initialize(self): def Initialize(self):
from asm3.assembly import AsmDocumentObserver from .assembly import AsmDocumentObserver
from asm3.gui import AsmCmdManager,SelectionObserver from .gui import AsmCmdManager,SelectionObserver
cmdSet = set() cmdSet = set()
for name,cmds in AsmCmdManager.Toolbars.items(): for name,cmds in AsmCmdManager.Toolbars.items():
cmdSet.update(cmds) cmdSet.update(cmds)
@ -39,7 +49,7 @@ class Assembly3Workbench(FreeCADGui.Workbench):
# ':/assembly3/ui/assembly3_prefs.ui','Assembly3') # ':/assembly3/ui/assembly3_prefs.ui','Assembly3')
def _contextMenu(self): def _contextMenu(self):
from asm3.gui import AsmCmdManager from .gui import AsmCmdManager
from collections import OrderedDict from collections import OrderedDict
menus = OrderedDict() menus = OrderedDict()
for cmd in AsmCmdManager.getInfo().Types: for cmd in AsmCmdManager.getInfo().Types:
@ -50,7 +60,7 @@ class Assembly3Workbench(FreeCADGui.Workbench):
self.appendContextMenu(name,cmds) self.appendContextMenu(name,cmds)
def ContextMenu(self, _recipient): def ContextMenu(self, _recipient):
from asm3.utils import logger from .utils import logger
logger.catch('',self._contextMenu) logger.catch('',self._contextMenu)
FreeCADGui.addWorkbench(Assembly3Workbench) FreeCADGui.addWorkbench(Assembly3Workbench)

View File

@ -1,5 +1,5 @@
from collections import namedtuple from collections import namedtuple
from asm3.utils import proxylogger as logger, objName from .utils import proxylogger as logger, objName
def propGet(self,obj): def propGet(self,obj):
return getattr(obj,self.Name) return getattr(obj,self.Name)

View File

@ -1,10 +1,10 @@
import random import random
from collections import namedtuple from collections import namedtuple
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
import asm3.assembly as asm from .assembly import Assembly, isTypeOf, setPlacement
from asm3.utils import syslogger as logger, objName, isSamePlacement from .utils import syslogger as logger, objName, isSamePlacement
from asm3.constraint import Constraint, cstrName from .constraint import Constraint, cstrName
from asm3.system import System from .system import System
# PartName: text name of the part # PartName: text name of the part
# Placement: the original placement of the part # Placement: the original placement of the part
@ -22,8 +22,8 @@ class Solver(object):
self.system = System.getSystem(assembly) self.system = System.getSystem(assembly)
cstrs = assembly.Proxy.getConstraints() cstrs = assembly.Proxy.getConstraints()
if not cstrs: if not cstrs:
logger.warn('no constraint found in assembly ' logger.debug('skip assembly {} with no constraint'.format(
'{}'.format(objName(assembly))) objName(assembly)))
return return
self._fixedGroup = 2 self._fixedGroup = 2
@ -107,7 +107,7 @@ class Solver(object):
touched = True touched = True
self.system.log('moving {} {} {} {}'.format( self.system.log('moving {} {} {} {}'.format(
partInfo.PartName,partInfo.Params,params,pla)) partInfo.PartName,partInfo.Params,params,pla))
asm.setPlacement(part,pla,undoDocs) setPlacement(part,pla,undoDocs)
if rollback is not None: if rollback is not None:
rollback.append((partInfo.PartName, rollback.append((partInfo.PartName,
part, part,
@ -158,7 +158,7 @@ def solve(objs=None,recursive=None,reportFailed=True,
if not objs: if not objs:
sels = FreeCADGui.Selection.getSelectionEx('',False) sels = FreeCADGui.Selection.getSelectionEx('',False)
if len(sels): if len(sels):
objs = asm.Assembly.getSelection() objs = Assembly.getSelection()
if not objs: if not objs:
raise RuntimeError('No assembly found in selection') raise RuntimeError('No assembly found in selection')
else: else:
@ -170,7 +170,7 @@ def solve(objs=None,recursive=None,reportFailed=True,
assemblies = [] assemblies = []
for obj in objs: for obj in objs:
if not asm.isTypeOf(obj,asm.Assembly): if not isTypeOf(obj,Assembly):
continue continue
if System.isDisabled(obj): if System.isDisabled(obj):
logger.debug('bypass disabled assembly {}'.format(objName(obj))) logger.debug('bypass disabled assembly {}'.format(objName(obj)))
@ -191,7 +191,7 @@ def solve(objs=None,recursive=None,reportFailed=True,
objs = FreeCAD.getDependentObjects(assemblies,False,True) objs = FreeCAD.getDependentObjects(assemblies,False,True)
assemblies = [] assemblies = []
for obj in objs: for obj in objs:
if not asm.isTypeOf(obj,asm.Assembly): if not isTypeOf(obj,Assembly):
continue continue
if System.isDisabled(obj): if System.isDisabled(obj):
logger.debug('skip disabled assembly {}'.format(objName(obj))) logger.debug('skip disabled assembly {}'.format(objName(obj)))
@ -216,7 +216,7 @@ def solve(objs=None,recursive=None,reportFailed=True,
if rollback is not None: if rollback is not None:
for name,part,pla in reversed(rollback): for name,part,pla in reversed(rollback):
logger.debug('roll back {} to {}'.format(name,pla)) logger.debug('roll back {} to {}'.format(name,pla))
asm.setPlacement(part,pla,None) setPlacement(part,pla,None)
raise raise
return True return True

View File

@ -1,6 +1,6 @@
from asm3.system import System, SystemBase, SystemExtension from .system import System, SystemBase, SystemExtension
from asm3.utils import syslogger as logger, objName from .utils import syslogger as logger, objName
import asm3.py_slvs.slvs as slvs from .py_slvs import slvs
class SystemSlvs(SystemBase): class SystemSlvs(SystemBase):
__metaclass__ = System __metaclass__ = System

View File

@ -1,8 +1,8 @@
from collections import namedtuple from collections import namedtuple
import pprint import pprint
from asm3.proxy import ProxyType, PropertyInfo from .proxy import ProxyType, PropertyInfo
from asm3.system import System, SystemBase, SystemExtension from .system import System, SystemBase, SystemExtension
from asm3.utils import syslogger as logger, objName from .utils import syslogger as logger, objName
import sympy as sp import sympy as sp
import sympy.vector as spv import sympy.vector as spv
import scipy.optimize as sopt import scipy.optimize as sopt

View File

@ -1,7 +1,6 @@
import os import os
import asm3.utils as utils from .utils import getIcon, syslogger as logger, objName
from asm3.utils import syslogger as logger, objName from .proxy import ProxyType, PropertyInfo
from asm3.proxy import ProxyType, PropertyInfo
class System(ProxyType): class System(ProxyType):
'solver system meta class' 'solver system meta class'
@ -26,7 +25,7 @@ class System(ProxyType):
icon = func(obj) icon = func(obj)
if icon: if icon:
return icon return icon
return utils.getIcon(mcs,mcs.isDisabled(obj)) return getIcon(mcs,mcs.isDisabled(obj))
@classmethod @classmethod
def isDisabled(mcs,obj): def isDisabled(mcs,obj):

View File

@ -7,7 +7,7 @@ assembly2
import FreeCAD, FreeCADGui, Part import FreeCAD, FreeCADGui, Part
import numpy as np import numpy as np
from asm3.FCADLogger import FCADLogger from .FCADLogger import FCADLogger
rootlogger = FCADLogger('asm3') rootlogger = FCADLogger('asm3')
logger = FCADLogger('asm3.main',parent=rootlogger) logger = FCADLogger('asm3.main',parent=rootlogger)
guilogger = FCADLogger('asm3.gui',parent=rootlogger) guilogger = FCADLogger('asm3.gui',parent=rootlogger)