fixed bug #556 - Premature loading of modules

The Draft and Arch modules now load heavy modules such
as Part or Sketch only when they use them, not anymore
at Init time.
This commit is contained in:
Yorik van Havre 2011-12-31 17:16:51 -02:00
parent a9d2f1c678
commit b8bcb43b66
16 changed files with 89 additions and 30 deletions

View File

@ -21,8 +21,8 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent,math
from draftlibs import fcgeo,fcvec
import FreeCAD,FreeCADGui,Draft,ArchComponent,math
from draftlibs import fcvec
from FreeCAD import Vector
from PyQt4 import QtCore
from pivy import coin
@ -81,6 +81,7 @@ class _Axis(ArchComponent.Component):
self.createGeometry(obj)
def createGeometry(self,obj):
import Part
pl = obj.Placement
geoms = []
dist = 0
@ -121,6 +122,7 @@ class _ViewProviderAxis(ArchComponent.ViewProviderComponent):
self.bubbles = None
def makeBubbles(self):
import Part
rn = self.ViewObject.RootNode.getChild(2).getChild(0).getChild(0)
if self.bubbles:
rn.removeChild(self.bubbles)

View File

@ -56,7 +56,7 @@ class _CommandBuilding:
if Draft.getType(sel[0]) in ["Cell","Site","Floor"]:
FreeCAD.ActiveDocument.openTransaction("Type conversion")
nobj = makeBuilding()
Commands.copyProperties(sel[0],nobj)
ArchCommands.copyProperties(sel[0],nobj)
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
FreeCAD.ActiveDocument.commitTransaction()
ok = True

View File

@ -21,7 +21,7 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent,ArchCommands
import FreeCAD,FreeCADGui,Draft,ArchComponent,ArchCommands
from FreeCAD import Vector
from PyQt4 import QtCore
@ -58,7 +58,7 @@ class _CommandCell:
if Draft.getType(sel[0]) in ["Floor","Site","Building"]:
FreeCAD.ActiveDocument.openTransaction("Type conversion")
nobj = makeCell()
Commands.copyProperties(sel[0],nobj)
ArchCommands.copyProperties(sel[0],nobj)
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
FreeCAD.ActiveDocument.commitTransaction()
ok = True
@ -86,6 +86,7 @@ class _Cell(ArchComponent.Component):
self.createGeometry(obj)
def createGeometry(self,obj):
import Part
pl = obj.Placement
if obj.Components:
if obj.JoinMode:

View File

@ -21,8 +21,8 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Part,Draft,MeshPart,ArchComponent
from draftlibs import fcgeo,fcvec
import FreeCAD,FreeCADGui,Draft,ArchComponent
from draftlibs import fcvec
from FreeCAD import Vector
from PyQt4 import QtCore
@ -138,6 +138,8 @@ def splitMesh(obj,mark=True):
def meshToShape(obj,mark=True):
'''meshToShape(object,[mark]): turns a mesh into a shape, joining coplanar facets. If
mark is True (default), non-solid objects will be marked in red'''
import Part,MeshPart
from draftlibs import fcgeo
if "Mesh" in obj.PropertiesList:
faces = []
mesh = obj.Mesh
@ -195,6 +197,7 @@ def meshToShape(obj,mark=True):
def removeShape(objs,mark=True):
'''takes an arch object (wall or structure) built on a cubic shape, and removes
the inner shape, keeping its length, width and height as parameters.'''
from draftlibs import fcgeo
if not isinstance(objs,list):
objs = [objs]
for obj in objs:

View File

@ -57,7 +57,7 @@ class _CommandFloor:
if Draft.getType(sel[0]) in ["Cell","Site","Building"]:
FreeCAD.ActiveDocument.openTransaction("Type conversion")
nobj = makeFloor()
Commands.copyProperties(sel[0],nobj)
ArchCommands.copyProperties(sel[0],nobj)
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
FreeCAD.ActiveDocument.commitTransaction()
ok = True

View File

@ -1,8 +1,8 @@
import FreeCAD,FreeCADGui,Part,ArchComponent,WorkingPlane,Drawing,math
import FreeCAD,FreeCADGui,ArchComponent,WorkingPlane,Drawing,math
from FreeCAD import Vector
from PyQt4 import QtCore
from pivy import coin
from draftlibs import fcvec,fcgeo
from draftlibs import fcvec
class _CommandSectionPlane:
@ -46,6 +46,7 @@ class _SectionPlane:
self.Type = "SectionPlane"
def execute(self,obj):
import Part
pl = obj.Placement
l = obj.ViewObject.DisplaySize
p = Part.makePlane(l,l,Vector(l/2,-l/2,0),Vector(0,0,-1))
@ -183,6 +184,8 @@ class _ArchDrawingView:
return Vector(lx,ly,0)
def getPath(self,face,plane):
import Part
from draftlibs import fcgeo
"returns a svg path from a face"
svg ='<path '
edges = fcgeo.sortEdges(face.Edges)

View File

@ -54,7 +54,7 @@ class _CommandSite:
if Draft.getType(sel[0]) in ["Cell","Building","Floor"]:
FreeCAD.ActiveDocument.openTransaction("Type conversion")
nobj = makeSite()
Commands.copyProperties(sel[0],nobj)
ArchCommands.copyProperties(sel[0],nobj)
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
FreeCAD.ActiveDocument.commitTransaction()
ok = True

View File

@ -21,8 +21,8 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent
from draftlibs import fcgeo,fcvec
import FreeCAD,FreeCADGui,Draft,ArchComponent
from draftlibs import fcvec
from FreeCAD import Vector
from PyQt4 import QtCore
@ -94,6 +94,8 @@ class _Structure(ArchComponent.Component):
self.createGeometry(obj)
def createGeometry(self,obj):
import Part
from draftlibs import fcgeo
# getting default values
height = normal = None
if obj.Length:

View File

@ -21,8 +21,8 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent
from draftlibs import fcgeo,fcvec
import FreeCAD,FreeCADGui,Draft,ArchComponent
from draftlibs import fcvec
from FreeCAD import Vector
from PyQt4 import QtCore
@ -93,6 +93,9 @@ class _Wall(ArchComponent.Component):
self.createGeometry(obj)
def createGeometry(self,obj):
import Part
from draftlibs import fcgeo
def getbase(wire):
"returns a full shape from a base wire"

View File

@ -21,8 +21,8 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent
from draftlibs import fcgeo,fcvec
import FreeCAD,FreeCADGui,Draft,ArchComponent
from draftlibs import fcvec
from FreeCAD import Vector
from PyQt4 import QtCore
@ -88,6 +88,8 @@ class _Window(ArchComponent.Component):
self.createGeometry(obj)
def createGeometry(self,obj):
import Part
from draftlibs import fcgeo
pl = obj.Placement
if obj.Base:
if obj.Base.isDerivedFrom("Part::Feature"):

View File

@ -73,9 +73,9 @@ How it works / how to extend:
# import FreeCAD modules
import FreeCAD, FreeCADGui, Part, math, sys, os, Image, Drawing, WorkingPlane
import FreeCAD, FreeCADGui, math, sys, os, WorkingPlane
from FreeCAD import Vector
from draftlibs import fcvec, fcgeo
from draftlibs import fcvec
from pivy import coin
#---------------------------------------------------------------------------
@ -145,6 +145,7 @@ def getRealName(name):
def getType(obj):
"getType(object): returns the Draft type of the given object"
import Part
if isinstance(obj,Part.Shape):
return "Shape"
if "Proxy" in obj.PropertiesList:
@ -390,6 +391,7 @@ def makeWire(pointslist,closed=False,placement=None,face=True,support=None):
and last points are identical, the wire is closed. If face is
true (and wire is closed), the wire will appear filled. Instead of
a pointslist, you can also pass a Part Wire.'''
from draftlibs import fcgeo
if not isinstance(pointslist,list):
nlist = []
for v in pointslist.Vertexes:
@ -589,6 +591,7 @@ def fuse(object1,object2):
the union of the 2 given objects. If the objects are
coplanar, a special Draft Wire is used, otherwise we use
a standard Part fuse.'''
from draftlibs import fcgeo
if fcgeo.isCoplanar(object1.Shape.fuse(object2.Shape).Faces):
obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython","Fusion")
_Wire(obj)
@ -704,6 +707,7 @@ def rotate(objectslist,angle,center=Vector(0,0,0),axis=Vector(0,0,1),copy=False)
omitted, the rotation will be around the vertical Z axis.
If copy is True, the actual objects are not moved, but copies
are created instead. The objects (or their copies) are returned.'''
import Part
typecheck([(copy,bool)], "rotate")
if not isinstance(objectslist,list): objectslist = [objectslist]
newobjlist = []
@ -797,6 +801,8 @@ def offset(obj,delta,copy=False,bind=False,sym=False,occ=False):
and the offsetted wires will be bound by their endpoints, forming a face
if sym is True, bind must be true too, and the offset is made on both
sides, the total width being the given delta length.'''
import Part
from draftlibs import fcgeo
def getRect(p,obj):
"returns length,heigh,placement"
@ -910,6 +916,7 @@ def draftify(objectslist,makeblock=False):
'''draftify(objectslist,[makeblock]): turns each object of the given list
(objectslist can also be a single object) into a Draft parametric
wire. If makeblock is True, multiple objects will be grouped in a block'''
from draftlibs import fcgeo
if not isinstance(objectslist,list):
objectslist = [objectslist]
newobjlist = []
@ -949,6 +956,8 @@ def getSVG(obj,modifier=100,textmodifier=100,linestyle="continuous",fillstyle="s
specifies a scale factor for linewidths in %, and textmodifier specifies
a scale factor for texts, in % (both default = 100). You can also supply
an arbitrary projection vector.'''
import Part
from draftlibs import fcgeo
svg = ""
tmod = ((textmodifier-100)/2)+100
if tmod == 0: tmod = 0.01
@ -1179,7 +1188,8 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,name="Sketch"):
constraints will be automatically added to wire nodes, rectangles
and circles. If addTo is an existing sketch, geometry will be added to it instead of
creating a new one.'''
import Part
from draftlibs import fcgeo
from Sketcher import Constraint
StartPoint = 1
@ -1382,6 +1392,8 @@ class _ViewProviderDimension:
obj.Override = ''
def calcGeom(self,obj):
import Part
from draftlibs import fcgeo
p1 = obj.Start
p4 = obj.End
base = Part.Line(p1,p4).toShape()
@ -1732,6 +1744,8 @@ class _ViewProviderAngularDimension:
self.onChanged(vobj,"FontName")
def calcGeom(self,obj):
import Part
from draftlibs import fcgeo
rad = (obj.Dimline.sub(obj.Center)).Length
cir = Part.makeCircle(rad,obj.Center,Vector(0,0,1),obj.FirstAngle,obj.LastAngle)
cp = fcgeo.findMidpoint(cir.Edges[0])
@ -1856,6 +1870,7 @@ class _Rectangle:
self.createGeometry(fp)
def createGeometry(self,fp):
import Part
plm = fp.Placement
p1 = Vector(0,0,0)
p2 = Vector(p1.x+fp.Length,p1.y,p1.z)
@ -1910,6 +1925,7 @@ class _Circle:
self.createGeometry(fp)
def createGeometry(self,fp):
import Part
plm = fp.Placement
shape = Part.makeCircle(fp.Radius,Vector(0,0,0),
Vector(0,0,1),fp.FirstAngle,fp.LastAngle)
@ -1967,6 +1983,8 @@ class _Wire:
fp.Points = pts
def createGeometry(self,fp):
import Part
from draftlibs import fcgeo
plm = fp.Placement
if fp.Base and (not fp.Tool):
if fp.Base.isDerivedFrom("Sketcher::SketchObject"):
@ -2065,6 +2083,7 @@ class _Polygon:
self.createGeometry(fp)
def createGeometry(self,fp):
import Part
plm = fp.Placement
angle = (math.pi*2)/fp.FacesNumber
if fp.DrawMode == 'inscribed':
@ -2142,6 +2161,7 @@ class _BSpline:
self.createGeometry(fp)
def createGeometry(self,fp):
import Part
plm = fp.Placement
if fp.Points:
if fp.Points[0] == fp.Points[-1]:
@ -2209,6 +2229,7 @@ class _Block:
self.createGeometry(fp)
def createGeometry(self,fp):
import Part
plm = fp.Placement
shps = []
for c in fp.Components:
@ -2247,6 +2268,8 @@ class _Shape2DView:
self.createGeometry(obj)
def createGeometry(self,obj):
import Drawing
from draftlibs import fcgeo
pl = obj.Placement
if obj.Base:
if obj.Base.isDerivedFrom("Part::Feature"):
@ -2296,6 +2319,7 @@ class _Array:
self.createGeometry(obj)
def createGeometry(self,obj):
from draftlibs import fcgeo
if obj.Base:
pl = obj.Placement
if obj.ArrayType == "ortho":
@ -2307,6 +2331,7 @@ class _Array:
obj.Placement = pl
def rectArray(self,shape,xvector,yvector,xnum,ynum):
import Part
base = [shape.copy()]
for xcount in range(xnum):
currentxvector=fcvec.scale(xvector,xcount)
@ -2324,6 +2349,7 @@ class _Array:
return Part.makeCompound(base)
def polarArray(self,shape,center,angle,num):
import Part
fraction = angle/num
base = [shape.copy()]
for i in range(num):
@ -2356,6 +2382,7 @@ class _Point:
self.createGeometry(fp)
def createGeometry(self,fp):
import Part
shape = Part.Vertex(Vector(fp.X,fp.Y,fp.Z))
fp.Shape = shape

View File

@ -26,9 +26,9 @@ __author__ = "Yorik van Havre"
__url__ = "http://free-cad.sourceforge.net"
import FreeCAD, FreeCADGui, math, Draft, DraftGui, DraftTrackers, Part, SketcherGui
import FreeCAD, FreeCADGui, math, Draft, DraftGui, DraftTrackers
from DraftGui import todo
from draftlibs import fcvec,fcgeo
from draftlibs import fcvec
from FreeCAD import Vector
from pivy import coin
from PyQt4 import QtCore,QtGui
@ -101,6 +101,10 @@ class Snapper:
be True to constrain the point against the closest working plane axis.
Screenpos can be a list, a tuple or a coin.SbVec2s object."""
global Part,fcgeo
import Part, SketcherGui
from draftlibs import fcgeo
def cstr(point):
"constrains if needed"
if constrain:
@ -110,7 +114,7 @@ class Snapper:
return point
snaps = []
# type conversion if needed
if isinstance(screenpos,list):
screenpos = tuple(screenpos)

View File

@ -29,9 +29,9 @@ __url__ = "http://free-cad.sourceforge.net"
# Generic stuff
#---------------------------------------------------------------------------
import os, FreeCAD, FreeCADGui, Part, WorkingPlane, math, re, importSVG, Draft, Draft_rc
import os, FreeCAD, FreeCADGui, WorkingPlane, math, re, importSVG, Draft, Draft_rc
from functools import partial
from draftlibs import fcvec,fcgeo
from draftlibs import fcvec
from FreeCAD import Vector
from DraftGui import todo,QtCore,QtGui
from DraftSnap import *
@ -311,6 +311,9 @@ class Creator:
def Activated(self,name="None"):
if FreeCAD.activeDraftCommand:
FreeCAD.activeDraftCommand.finish()
global Part, fcgeo
import Part
from draftlibs import fcgeo
self.ui = None
self.call = None
self.doc = None
@ -1624,6 +1627,9 @@ class Modifier:
def Activated(self,name="None"):
if FreeCAD.activeDraftCommand:
FreeCAD.activeDraftCommand.finish()
global Part, fcgeo
import Part
from draftlibs import fcgeo
self.ui = None
self.call = None
self.commitList = []

View File

@ -25,15 +25,18 @@ __title__="FreeCAD Draft Trackers"
__author__ = "Yorik van Havre"
__url__ = "http://free-cad.sourceforge.net"
import FreeCAD,FreeCADGui,math,Draft,Part
import FreeCAD,FreeCADGui,math,Draft
from FreeCAD import Vector
from draftlibs import fcvec,fcgeo
from draftlibs import fcvec
from pivy import coin
from DraftGui import todo
class Tracker:
"A generic Draft Tracker, to be used by other specific trackers"
def __init__(self,dotted=False,scolor=None,swidth=None,children=[],ontop=False):
global Part, fcgeo
import Part
from draftlibs import fcgeo
self.ontop = ontop
color = coin.SoBaseColor()
color.rgb = scolor or FreeCADGui.draftToolBar.getDefaultColor("ui")
@ -228,6 +231,7 @@ class dimTracker(Tracker):
self.calc()
def calc(self):
import Part
if (self.p1 != None) and (self.p2 != None):
points = [fcvec.tup(self.p1,True),fcvec.tup(self.p2,True),\
fcvec.tup(self.p1,True),fcvec.tup(self.p2,True)]

View File

@ -22,7 +22,7 @@
#***************************************************************************
import FreeCAD, FreeCADGui, Part, math
import FreeCAD, FreeCADGui, math
from FreeCAD import Vector
from draftlibs import fcvec

View File

@ -31,8 +31,8 @@ paths, lines, arcs and rects.
Bezier curves are skipped.
'''
import xml.sax, string, FreeCAD, os, Part, math, re, Draft
from draftlibs import fcvec, fcgeo
import xml.sax, string, FreeCAD, os, math, re, Draft
from draftlibs import fcvec
from FreeCAD import Vector
try: import FreeCADGui
@ -241,6 +241,8 @@ class svgHandler(xml.sax.ContentHandler):
self.transform = None
self.grouptransform = []
self.lastdim = None
import Part
if gui and draftui:
r = float(draftui.color.red()/255.0)