Added search path and preferences support for tools

This commit is contained in:
Markus Lampert
2019-10-17 22:25:49 -07:00
parent f8887d5e12
commit 2e1bea0237
7 changed files with 230 additions and 10 deletions

View File

@@ -38,7 +38,7 @@ class PostProcessor:
def load(cls, processor):
PathLog.track(processor)
syspath = sys.path
paths = PathPreferences.searchPaths()
paths = PathPreferences.searchPathsPost()
paths.extend(sys.path)
sys.path = paths

View File

@@ -41,6 +41,10 @@ PostProcessorBlacklist = "PostProcessorBlacklist"
PostProcessorOutputFile = "PostProcessorOutputFile"
PostProcessorOutputPolicy = "PostProcessorOutputPolicy"
LastPathToolBit = "LastPathToolBit"
LastPathToolLibrary = "LastPathToolLibrary"
LastPathToolTemplate = "LastPathToolTemplate"
# Linear tolerance to use when generating Paths, eg when tessellating geometry
GeometryTolerance = "GeometryTolerance"
LibAreaCurveAccuracy = "LibAreaCurveAccuarcy"
@@ -52,14 +56,16 @@ def preferences():
return FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Path")
def pathScriptsSourcePath():
return FreeCAD.getHomePath() + ("Mod/Path/PathScripts/")
return os.path.join(FreeCAD.getHomePath(), "Mod/Path/PathScripts/")
def pathScriptsPostSourcePath():
return pathScriptsSourcePath() + ("/post/")
def pathDefaultToolsPath(sub=None):
if sub:
return os.path.join(FreeCAD.getHomePath(), "Mod/Path/Tools/", sub)
return os.path.join(FreeCAD.getHomePath(), "Mod/Path/Tools/")
def allAvailablePostProcessors():
allposts = []
for path in searchPaths():
for path in searchPathsPost():
posts = [ str(os.path.split(os.path.splitext(p)[0])[1][:-5]) for p in glob.glob(path + '/*_post.py')]
allposts.extend(posts)
allposts.sort()
@@ -108,10 +114,38 @@ def searchPaths():
if p:
paths.append(p)
paths.append(macroFilePath())
paths.append(pathScriptsPostSourcePath())
return paths
def searchPathsPost():
paths = []
p = defaultFilePath()
if p:
paths.append(p)
paths.append(macroFilePath())
paths.append(os.path.join(pathScriptsSourcePath(), "post/"))
paths.append(pathScriptsSourcePath())
return paths
def searchPathsTool(sub='Bit'):
paths = []
if 'Bit' == sub:
paths.append(lastPathToolBit())
if 'Library' == sub:
paths.append(lastPathToolLibrary())
if 'Template' == sub:
paths.append(lastPathToolTemplate())
def appendPath(p, sub):
if p:
paths.append(os.path.join(p, 'Tools', sub))
paths.append(os.path.join(p, sub))
paths.append(p)
appendPath(defaultFilePath(), sub)
appendPath(macroFilePath(), sub)
appendPath(os.path.join(FreeCAD.getHomePath(), "Mod/Path/"), sub)
return paths
def defaultJobTemplate():
template = preferences().GetString(DefaultJobTemplate)
if 'xml' not in template:
@@ -165,3 +199,19 @@ def setDefaultTaskPanelLayout(style):
def experimentalFeaturesEnabled():
return preferences().GetBool(EnableExperimentalFeatures, False)
def lastPathToolBit():
return preferences().GetString(LastPathToolBit, pathDefaultToolsPath('Bit'))
def setLastPathToolBit(path):
return preferences().SetString(LastPathToolBit, path)
def lastPathToolLibrary():
return preferences().GetString(LastPathToolLibrary, pathDefaultToolsPath('Library'))
def setLastPathToolLibrary(path):
return preferences().SetString(LastPathToolLibrary, path)
def lastPathToolTemplate():
return preferences().GetString(LastPathToolTemplate, pathDefaultToolsPath('Template'))
def setLastPathToolTemplate(path):
return preferences().SetString(LastPathToolTemplate, path)

View File

@@ -26,12 +26,14 @@ import FreeCAD
import Part
import PathScripts.PathGeom as PathGeom
import PathScripts.PathLog as PathLog
import PathScripts.PathPreferences as PathPreferences
import PathScripts.PathSetupSheetOpPrototype as PathSetupSheetOpPrototype
import PathScripts.PathUtil as PathUtil
import PySide
import Sketcher
import json
import math
import os
import zipfile
__title__ = "Tool bits."
@@ -54,6 +56,28 @@ ParameterTypeConstraint = {
}
def _findTool(path, typ):
if os.path.exists(path):
return path
def searchFor(pname, fname):
if fname:
for p in PathPreferences.searchPathsTool(typ):
f = os.path.join(p, fname)
if os.path.exists(f):
return f
if pname and '/' != pname:
ppname, pfname = os.path.split(pname)
ffname = os.path.join(pfname, fname) if fname else pfname
return searchFor(ppname, ffname)
return None
return searchFor(path, '')
def findTemplate(path):
'''findTemplate(path) ... search for path, full and partially in all known template directories.'''
return _findTool(path, 'Template')
def updateConstraint(sketch, name, value):
for i, constraint in enumerate(sketch.Constraints):
if constraint.Name.split(';')[0] == name:
@@ -136,16 +160,18 @@ class ToolBit(object):
obj.Shape = Part.Shape()
def _loadBitBody(self, obj, path=None):
if not path:
path = obj.BitTemplate
p = path if path else obj.BitTemplate
docOpened = False
doc = None
for d in FreeCAD.listDocuments():
if FreeCAD.getDocument(d).FileName == path:
if FreeCAD.getDocument(d).FileName == p:
doc = FreeCAD.getDocument(d)
break
if doc is None:
doc = FreeCAD.open(path)
p = findTemplate(p)
if not path and p != obj.BitTemplate:
obj.BitTemplate = p
doc = FreeCAD.open(p)
docOpened = True
return (doc, docOpened)