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

View File

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

27
gui.py
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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