Initial attempt to fix import issues caused by verutil.py implementation.

This commit is contained in:
Jeremy Wright 2014-12-01 11:51:26 -05:00
parent d9ca06a6e8
commit 087f0621a7
11 changed files with 135 additions and 210 deletions

View File

@ -18,7 +18,6 @@ cadquery/freecad_impl/exporters.py
cadquery/freecad_impl/geom.py
cadquery/freecad_impl/importers.py
cadquery/freecad_impl/shapes.py
cadquery/freecad_impl/verutil.py
cadquery/plugins/__init__.py
tests/TestCQSelectors.py
tests/TestCadObjects.py

View File

@ -1,5 +1,3 @@
#these items point to the freecad implementation
from .freecad_impl.geom import Plane,BoundBox,Vector,Matrix,sortWiresByBuildOrder
from .freecad_impl.shapes import Shape,Vertex,Edge,Face,Wire,Solid,Shell,Compound
@ -14,8 +12,8 @@ from .CQ import CQ,CQContext,Workplane
__all__ = [
'CQ','Workplane','plugins','selectors','Plane','BoundBox','Matrix','Vector','sortWiresByBuildOrder',
'Shape','Vertex','Edge','Wire','Solid','Shell','Compound','exporters', 'importers', 'NearestToPointSelector','ParallelDirSelector','DirectionSelector','PerpendicularDirSelector','TypeSelector','DirectionMinMaxSelector','StringSyntaxSelector','Selector','plugins'
'CQ','Workplane','plugins','selectors','Plane','BoundBox','Matrix','Vector','sortWiresByBuildOrder',
'Shape','Vertex','Edge','Wire','Solid','Shell','Compound','exporters', 'importers', 'NearestToPointSelector','ParallelDirSelector','DirectionSelector','PerpendicularDirSelector','TypeSelector','DirectionMinMaxSelector','StringSyntaxSelector','Selector','plugins'
]
__version__ = "0.1.7"
__version__ = "0.1.7"

View File

@ -1,18 +1,88 @@
"""
Copyright (C) 2011-2014 Parametric Products Intellectual Holdings, LLC
Copyright (C) 2011-2014 Parametric Products Intellectual Holdings, LLC
This file is part of CadQuery.
This file is part of CadQuery.
CadQuery is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
CadQuery is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
CadQuery is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
CadQuery is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; If not, see <http://www.gnu.org/licenses/>
You should have received a copy of the GNU Lesser General Public
License along with this library; If not, see <http://www.gnu.org/licenses/>
"""
import os, sys
def _fc_path():
"""Find FreeCAD"""
_PATH = ""
if _PATH:
return _PATH
#look for FREECAD_LIB env variable
if os.environ.has_key('FREECAD_LIB'):
_PATH = os.environ.get('FREECAD_LIB')
if os.path.exists( _PATH):
return _PATH
if sys.platform.startswith('linux'):
#Make some dangerous assumptions...
for _PATH in [
os.path.join(os.path.expanduser("~"), "lib/freecad/lib"),
"/usr/local/lib/freecad/lib",
"/usr/lib/freecad/lib",
]:
if os.path.exists(_PATH):
return _PATH
elif sys.platform.startswith('win'):
#try all the usual suspects
for _PATH in [
"c:/Program Files/FreeCAD0.12/bin",
"c:/Program Files/FreeCAD0.13/bin",
"c:/Program Files/FreeCAD0.14/bin",
"c:/Program Files/FreeCAD0.15/bin",
"c:/Program Files/FreeCAD0.16/bin",
"c:/Program Files/FreeCAD0.17/bin",
"c:/Program Files (x86)/FreeCAD0.12/bin",
"c:/Program Files (x86)/FreeCAD0.13/bin",
"c:/Program Files (x86)/FreeCAD0.14/bin",
"c:/Program Files (x86)/FreeCAD0.15/bin",
"c:/Program Files (x86)/FreeCAD0.16/bin",
"c:/Program Files (x86)/FreeCAD0.17/bin",
"c:/apps/FreeCAD0.12/bin",
"c:/apps/FreeCAD0.13/bin",
"c:/apps/FreeCAD0.14/bin",
"c:/apps/FreeCAD0.15/bin",
"c:/apps/FreeCAD0.16/bin",
"c:/apps/FreeCAD0.17/bin",
"c:/Program Files/FreeCAD 0.12/bin",
"c:/Program Files/FreeCAD 0.13/bin",
"c:/Program Files/FreeCAD 0.14/bin",
"c:/Program Files/FreeCAD 0.15/bin",
"c:/Program Files/FreeCAD 0.16/bin",
"c:/Program Files/FreeCAD 0.17/bin",
"c:/Program Files (x86)/FreeCAD 0.12/bin",
"c:/Program Files (x86)/FreeCAD 0.13/bin",
"c:/Program Files (x86)/FreeCAD 0.14/bin",
"c:/Program Files (x86)/FreeCAD 0.15/bin",
"c:/Program Files (x86)/FreeCAD 0.16/bin",
"c:/Program Files (x86)/FreeCAD 0.17/bin",
"c:/apps/FreeCAD 0.12/bin",
"c:/apps/FreeCAD 0.13/bin",
"c:/apps/FreeCAD 0.14/bin",
"c:/apps/FreeCAD 0.15/bin",
"c:/apps/FreeCAD 0.16/bin",
"c:/apps/FreeCAD 0.17/bin",
]:
if os.path.exists(_PATH):
return _PATH
#Make sure that the correct FreeCAD path shows up in Python's system path
sys.path.insert(0, _fc_path())

View File

@ -21,11 +21,13 @@
"""
import cadquery
from .verutil import fc_import
FreeCAD = fc_import("FreeCAD")
#from .verutil import fc_import
#FreeCAD = fc_import("FreeCAD")
import FreeCAD
import tempfile,os,StringIO
Drawing = fc_import("FreeCAD.Drawing")
import Drawing
#Drawing = fc_import("FreeCAD.Drawing")
#_FCVER = freecad_version()
#if _FCVER>=(0,13):
#import Drawing as FreeCADDrawing #It's in FreeCAD lib path

View File

@ -19,8 +19,9 @@
import math,sys
#import FreeCAD
from .verutil import fc_import
FreeCAD = fc_import("FreeCAD")
#from .verutil import fc_import
#FreeCAD = fc_import("FreeCAD")
import FreeCAD
#Turns out we don't need the Part module here.
def sortWiresByBuildOrder(wireList,plane,result=[]):

View File

@ -21,9 +21,11 @@
"""
import cadquery
from .shapes import Shape
from .verutil import fc_import
FreeCAD = fc_import("FreeCAD")
Part = fc_import("FreeCAD.Part")
#from .verutil import fc_import
# FreeCAD = fc_import("FreeCAD")
# Part = fc_import("FreeCAD.Part")
import FreeCAD
import Part
class ImportTypes:
STEP = "STEP"

View File

@ -50,9 +50,10 @@
from cadquery import Vector, BoundBox
import FreeCAD
from .verutil import fc_import
#from .verutil import fc_import
FreeCADPart = fc_import("FreeCAD.Part")
#FreeCADPart = fc_import("FreeCAD.Part")
import Part as FreeCADPart
class Shape(object):

View File

@ -1,155 +0,0 @@
"""
This file is part of CadQuery.
CadQuery is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
CadQuery is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; If not, see <http://www.gnu.org/licenses/>
An exporter should provide functionality to accept a shape, and return
a string containing the model content.
"""
import re
from importlib import import_module
import os
import sys
MEMO_VERSION = None
SUBMODULES = None
_PATH = None
def _figure_out_version(freecadversion):
"""Break this out for testability."""
return tuple(
((int(re.sub("([0-9]*).*", "\\1", part) or 0))
for part in freecadversion[:3]))
def _fc_path():
"""Find FreeCAD"""
global _PATH
if _PATH:
return _PATH
#look for FREECAD_LIB env variable
if os.environ.has_key('FREECAD_LIB'):
_PATH = os.environ.get('FREECAD_LIB')
if os.path.exists( _PATH):
return _PATH
if sys.platform.startswith('linux'):
#Make some dangerous assumptions...
for _PATH in [
os.path.join(os.path.expanduser("~"), "lib/freecad/lib"),
"/usr/local/lib/freecad/lib",
"/usr/lib/freecad/lib",
]:
if os.path.exists(_PATH):
return _PATH
elif sys.platform.startswith('win'):
#try all the usual suspects
for _PATH in [
"c:/Program Files/FreeCAD0.12/bin",
"c:/Program Files/FreeCAD0.13/bin",
"c:/Program Files/FreeCAD0.14/bin",
"c:/Program Files/FreeCAD0.15/bin",
"c:/Program Files/FreeCAD0.16/bin",
"c:/Program Files/FreeCAD0.17/bin",
"c:/Program Files (x86)/FreeCAD0.12/bin",
"c:/Program Files (x86)/FreeCAD0.13/bin",
"c:/Program Files (x86)/FreeCAD0.14/bin",
"c:/Program Files (x86)/FreeCAD0.15/bin",
"c:/Program Files (x86)/FreeCAD0.16/bin",
"c:/Program Files (x86)/FreeCAD0.17/bin",
"c:/apps/FreeCAD0.12/bin",
"c:/apps/FreeCAD0.13/bin",
"c:/apps/FreeCAD0.14/bin",
"c:/apps/FreeCAD0.15/bin",
"c:/apps/FreeCAD0.16/bin",
"c:/apps/FreeCAD0.17/bin",
"c:/Program Files/FreeCAD 0.12/bin",
"c:/Program Files/FreeCAD 0.13/bin",
"c:/Program Files/FreeCAD 0.14/bin",
"c:/Program Files/FreeCAD 0.15/bin",
"c:/Program Files/FreeCAD 0.16/bin",
"c:/Program Files/FreeCAD 0.17/bin",
"c:/Program Files (x86)/FreeCAD 0.12/bin",
"c:/Program Files (x86)/FreeCAD 0.13/bin",
"c:/Program Files (x86)/FreeCAD 0.14/bin",
"c:/Program Files (x86)/FreeCAD 0.15/bin",
"c:/Program Files (x86)/FreeCAD 0.16/bin",
"c:/Program Files (x86)/FreeCAD 0.17/bin",
"c:/apps/FreeCAD 0.12/bin",
"c:/apps/FreeCAD 0.13/bin",
"c:/apps/FreeCAD 0.14/bin",
"c:/apps/FreeCAD 0.15/bin",
"c:/apps/FreeCAD 0.16/bin",
"c:/apps/FreeCAD 0.17/bin",
]:
if os.path.exists(_PATH):
return _PATH
def freecad_version():
"""Determine the freecad version and return it as a simple
comparable tuple"""
#If we cannot find freecad, we append it to the path if possible
_pthtmp = _fc_path()
if not _pthtmp in sys.path:
sys.path.append(_pthtmp)
import FreeCAD
global MEMO_VERSION
if not MEMO_VERSION:
MEMO_VERSION = _figure_out_version(FreeCAD.Version())
return MEMO_VERSION
def _find_submodules():
"""Find the list of allowable submodules in fc13"""
global SUBMODULES
searchpath = _fc_path()
if not SUBMODULES:
SUBMODULES = [
re.sub("(.*)\\.(py|so)","\\1", filename)
for filename in os.listdir(searchpath)
if (
filename.endswith(".so") or
filename.endswith(".py") or
filename.endswith(".dll") )] #Yes, complex. Sorry.
return SUBMODULES
def fc_import(modulename):
"""Intelligent import of freecad components.
If we are in 0.12, we can import FreeCAD.Drawing
If we are in 0.13, we need to set sys.path and import Drawing as toplevel.
This may or may not be a FreeCAD bug though.
This is ludicrously complex and feels awful. Kinda like a lot of OCC.
"""
#Note that this also sets the path as a side effect.
_fcver = freecad_version()
if _fcver[0:2] >= (0, 13):
if modulename in _find_submodules():
return import_module(modulename)
elif re.sub("^FreeCAD\\.", "", modulename) in _find_submodules():
return import_module(re.sub("^FreeCAD\\.", "", modulename))
else:
raise ImportError, "Module %s not found/allowed in %s" % (
modulename, _PATH)
elif _fcver[0:2] == (0, 12):
return import_module(modulename)
else:
raise RuntimeError, "Invalid freecad version: %s" % \
str(".".join(_fcver))
__ALL__ = ['fc_import', 'freecad_version']

View File

@ -4,10 +4,12 @@ import sys
import unittest
from tests import BaseTest
from cadquery.freecad_impl.verutil import fc_import
FreeCAD = fc_import("FreeCAD")
if not hasattr(FreeCAD, 'Part'):
FreeCAD.Part = fc_import("FreeCAD.Part")
#from cadquery.freecad_impl.verutil import fc_import
# FreeCAD = fc_import("FreeCAD")
# if not hasattr(FreeCAD, 'Part'):
# FreeCAD.Part = fc_import("FreeCAD.Part")
import FreeCAD
import Part
from cadquery import *

View File

@ -4,26 +4,26 @@
#core modules
#my modules
from cadquery.freecad_impl import verutil
from tests import BaseTest
#from cadquery.freecad_impl import verutil
#from tests import BaseTest
class TestVersionsForImport(BaseTest):
"""Test version checks."""
def test_013_version(self):
"""Make sure various 0.13 Version calls work correctly"""
self.assertEquals(verutil._figure_out_version(
['0', '13', '2055 (Git)',
'git://git.code.sf.net/p/free-cad/code',
'2013/04/18 13:48:49', 'master',
'3511a807a30cf41909aaf12a1efe1db6c53db577']),
(0,13,2055))
self.assertEquals(verutil._figure_out_version(
['0', '13', '12345']),
(0,13,12345))
self.assertEquals(verutil._figure_out_version(
['0', '13', 'SOMETAGTHATBREAKSSTUFF']),
(0,13,0))
# class TestVersionsForImport(BaseTest):
# """Test version checks."""
#
# def test_013_version(self):
# """Make sure various 0.13 Version calls work correctly"""
# self.assertEquals(verutil._figure_out_version(
# ['0', '13', '2055 (Git)',
# 'git://git.code.sf.net/p/free-cad/code',
# '2013/04/18 13:48:49', 'master',
# '3511a807a30cf41909aaf12a1efe1db6c53db577']),
# (0,13,2055))
# self.assertEquals(verutil._figure_out_version(
# ['0', '13', '12345']),
# (0,13,12345))
# self.assertEquals(verutil._figure_out_version(
# ['0', '13', 'SOMETAGTHATBREAKSSTUFF']),
# (0,13,0))

View File

@ -3,11 +3,16 @@ import unittest
import sys
import os
from cadquery.freecad_impl.verutil import fc_import
FreeCAD = fc_import("FreeCAD")
#from cadquery.freecad_impl.verutil import fc_import
#FreeCAD = fc_import("FreeCAD")
#import cadquery.freecad_impl
import FreeCAD
P = fc_import("FreeCAD.Part")
V = fc_import("FreeCAD").Base.Vector
# P = fc_import("FreeCAD.Part")
# V = fc_import("FreeCAD").Base.Vector
import Part as P
from FreeCAD import Vector as V
def readFileAsString(fileName):
f= open(fileName,'r')