| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import FreeCAD |
| import Path |
| import glob |
| import os |
| import pathlib |
| from collections import defaultdict |
| from typing import Optional |
|
|
|
|
| if False: |
| Path.Log.setLevel(Path.Log.Level.DEBUG, Path.Log.thisModule()) |
| Path.Log.trackModule(Path.Log.thisModule()) |
| else: |
| Path.Log.setLevel(Path.Log.Level.INFO, Path.Log.thisModule()) |
|
|
|
|
| translate = FreeCAD.Qt.translate |
|
|
| PreferencesGroup = "User parameter:BaseApp/Preferences/Mod/CAM" |
|
|
| DefaultFilePath = "DefaultFilePath" |
| DefaultJobTemplate = "DefaultJobTemplate" |
| DefaultStockTemplate = "DefaultStockTemplate" |
| DefaultTaskPanelLayout = "DefaultTaskPanelLayout" |
|
|
| PostProcessorDefault = "PostProcessorDefault" |
| PostProcessorDefaultArgs = "PostProcessorDefaultArgs" |
| PostProcessorBlacklist = "PostProcessorBlacklist" |
| PostProcessorOutputFile = "PostProcessorOutputFile" |
| PostProcessorOutputPolicy = "PostProcessorOutputPolicy" |
|
|
| ToolGroup = PreferencesGroup + "/Tools" |
| ToolPath = "ToolPath" |
| LastToolLibrary = "LastToolLibrary" |
| LastToolLibrarySortKey = "LastToolLibrarySortKey" |
|
|
| |
| GeometryTolerance = "GeometryTolerance" |
| LibAreaCurveAccuracy = "LibAreaCurveAccuracy" |
|
|
| WarningSuppressRapidSpeeds = "WarningSuppressRapidSpeeds" |
| WarningSuppressAllSpeeds = "WarningSuppressAllSpeeds" |
| WarningSuppressSelectionMode = "WarningSuppressSelectionMode" |
| WarningSuppressOpenCamLib = "WarningSuppressOpenCamLib" |
| WarningSuppressVelocity = "WarningSuppressVelocity" |
| EnableExperimentalFeatures = "EnableExperimentalFeatures" |
| EnableAdvancedOCLFeatures = "EnableAdvancedOCLFeatures" |
|
|
|
|
| _observers = defaultdict(list) |
|
|
|
|
| def _add_group_observer(group, callback): |
| """Add an observer for any changes on the given parameter group""" |
| _observers[group].append(callback) |
|
|
|
|
| def _emit_change(group, *args): |
| for cb in _observers[group]: |
| cb(group, *args) |
|
|
|
|
| def preferences(): |
| return FreeCAD.ParamGet(PreferencesGroup) |
|
|
|
|
| def tool_preferences(): |
| return FreeCAD.ParamGet(ToolGroup) |
|
|
|
|
| def addToolPreferenceObserver(callback): |
| _add_group_observer(ToolGroup, callback) |
|
|
|
|
| def pathPostSourcePath(): |
| return os.path.join(FreeCAD.getHomePath(), "Mod/CAM/Path/Post/") |
|
|
|
|
| def getBuiltinAssetPath() -> pathlib.Path: |
| home = pathlib.Path(FreeCAD.getHomePath()) |
| return home / "Mod" / "CAM" / "Tools" |
|
|
|
|
| def getBuiltinLibraryPath() -> pathlib.Path: |
| return getBuiltinAssetPath() / "Library" |
|
|
|
|
| def getBuiltinShapePath() -> pathlib.Path: |
| return getBuiltinAssetPath() / "Shape" |
|
|
|
|
| def getBuiltinToolBitPath() -> pathlib.Path: |
| return getBuiltinAssetPath() / "Bit" |
|
|
|
|
| def getDefaultAssetPath() -> Path: |
| data_dir = pathlib.Path(FreeCAD.getUserAppDataDir()) |
| asset_path = data_dir / "CamAssets" |
| asset_path.mkdir(parents=True, exist_ok=True) |
| return asset_path |
|
|
|
|
| def getAssetPath() -> pathlib.Path: |
| pref = tool_preferences() |
|
|
| |
| cam_assets_path = pref.GetString(ToolPath, "") |
| if cam_assets_path: |
| |
| most_recent_path = FreeCAD.ApplicationDirectories.mostRecentConfigFromBase(cam_assets_path) |
| return pathlib.Path(most_recent_path) |
|
|
| |
| legacy_path = defaultFilePath() |
| if legacy_path: |
| legacy_path_obj = pathlib.Path(legacy_path) |
| if legacy_path_obj.exists() and legacy_path_obj.is_dir(): |
| |
| setAssetPath(legacy_path_obj) |
| |
| most_recent_legacy = FreeCAD.ApplicationDirectories.mostRecentConfigFromBase( |
| str(legacy_path_obj) |
| ) |
| return pathlib.Path(most_recent_legacy) |
|
|
| |
| default = getDefaultAssetPath() |
| |
| most_recent_default = FreeCAD.ApplicationDirectories.mostRecentConfigFromBase(str(default)) |
| return pathlib.Path(most_recent_default) |
|
|
|
|
| def setAssetPath(path: pathlib.Path): |
| Path.Log.debug(f"Setting asset path to {path}") |
| assert path.is_dir(), f"Cannot put a non-initialized asset directory into preferences: {path}" |
| pref = tool_preferences() |
| current_path = pref.GetString(ToolPath, "") |
| if str(path) == current_path: |
| return |
| pref.SetString(ToolPath, str(path)) |
| _emit_change(ToolGroup, ToolPath, path) |
|
|
|
|
| def getToolBitPath() -> pathlib.Path: |
| return getAssetPath() / "Tools" / "Bit" |
|
|
|
|
| def getTemplateDirectory() -> pathlib.Path: |
| """Returns the directory where job templates should be saved.""" |
| template_path = getAssetPath() / "Templates" |
| template_path.mkdir(parents=True, exist_ok=True) |
| return template_path |
|
|
|
|
| def getLastToolLibrary() -> Optional[str]: |
| pref = tool_preferences() |
| return pref.GetString(LastToolLibrary) or None |
|
|
|
|
| def setLastToolLibrary(name: str): |
| assert isinstance(name, str), f"Library name '{name}' is not a string" |
| pref = tool_preferences() |
| pref.SetString(LastToolLibrary, name) |
|
|
|
|
| def getLastToolLibrarySortKey() -> Optional[str]: |
| pref = tool_preferences() |
| return pref.GetString(LastToolLibrarySortKey) or None |
|
|
|
|
| def setLastToolLibrarySortKey(name: str): |
| pref = tool_preferences() |
| pref.SetString(LastToolLibrarySortKey, name) |
|
|
|
|
| def allAvailablePostProcessors(): |
| allposts = [] |
| 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() |
| return allposts |
|
|
|
|
| def allEnabledPostProcessors(include=None): |
| blacklist = postProcessorBlacklist() |
| enabled = [ |
| processor for processor in allAvailablePostProcessors() if processor not in blacklist |
| ] |
| if include: |
| postlist = list(set(include + enabled)) |
| postlist.sort() |
| return postlist |
| return enabled |
|
|
|
|
| def defaultPostProcessor(): |
| pref = preferences() |
| return pref.GetString(PostProcessorDefault, "") |
|
|
|
|
| def defaultPostProcessorArgs(): |
| pref = preferences() |
| return pref.GetString(PostProcessorDefaultArgs, "") |
|
|
|
|
| def defaultGeometryTolerance(): |
| return preferences().GetFloat(GeometryTolerance, 0.01) |
|
|
|
|
| def defaultLibAreaCurveAccuracy(): |
| return preferences().GetFloat(LibAreaCurveAccuracy, 0.01) |
|
|
|
|
| def defaultFilePath(): |
| return preferences().GetString(DefaultFilePath) |
|
|
|
|
| def filePath(): |
| path = defaultFilePath() |
| if not path: |
| path = str(getAssetPath()) |
| return path |
|
|
|
|
| def macroFilePath(): |
| grp = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro") |
| return grp.GetString("MacroPath", FreeCAD.getUserMacroDir()) |
|
|
|
|
| def searchPaths(): |
| paths = [] |
| |
| paths.append(str(getTemplateDirectory())) |
| |
| p = defaultFilePath() |
| if p: |
| paths.append(p) |
| paths.append(macroFilePath()) |
| return paths |
|
|
|
|
| def searchPathsPost(): |
| paths = [] |
| p = defaultFilePath() |
| if p: |
| paths.append(p) |
| paths.append(macroFilePath()) |
| paths.append(os.path.join(pathPostSourcePath(), "scripts/")) |
| paths.append(pathPostSourcePath()) |
| return paths |
|
|
|
|
| def defaultJobTemplate(): |
| template = preferences().GetString(DefaultJobTemplate) |
| if "xml" not in template: |
| return template |
| return "" |
|
|
|
|
| def setJobDefaults(jobTemplate, geometryTolerance, curveAccuracy): |
| Path.Log.track("(%s, %s, %s)" % (jobTemplate, geometryTolerance, curveAccuracy)) |
| pref = preferences() |
| pref.SetString(DefaultJobTemplate, jobTemplate) |
| pref.SetFloat(GeometryTolerance, geometryTolerance) |
| pref.SetFloat(LibAreaCurveAccuracy, curveAccuracy) |
|
|
|
|
| def postProcessorBlacklist(): |
| pref = preferences() |
| blacklist = pref.GetString(PostProcessorBlacklist, "") |
| if not blacklist: |
| return [] |
| return eval(blacklist) |
|
|
|
|
| def setPostProcessorDefaults(processor, args, blacklist): |
| pref = preferences() |
| pref.SetString(PostProcessorDefault, processor) |
| pref.SetString(PostProcessorDefaultArgs, args) |
| pref.SetString(PostProcessorBlacklist, "%s" % (blacklist)) |
|
|
|
|
| def setOutputFileDefaults(fileName, policy): |
| pref = preferences() |
| pref.SetString(PostProcessorOutputFile, fileName) |
| pref.SetString(PostProcessorOutputPolicy, policy) |
|
|
|
|
| def defaultOutputFile(): |
| pref = preferences() |
| return pref.GetString(PostProcessorOutputFile, "") |
|
|
|
|
| def defaultOutputPolicy(): |
| pref = preferences() |
| return pref.GetString(PostProcessorOutputPolicy, "") |
|
|
|
|
| def defaultStockTemplate(): |
| return preferences().GetString(DefaultStockTemplate, "") |
|
|
|
|
| def setDefaultStockTemplate(template): |
| preferences().SetString(DefaultStockTemplate, template) |
|
|
|
|
| def defaultTaskPanelLayout(): |
| return preferences().GetInt(DefaultTaskPanelLayout, 0) |
|
|
|
|
| def setDefaultTaskPanelLayout(style): |
| preferences().SetInt(DefaultTaskPanelLayout, style) |
|
|
|
|
| def advancedOCLFeaturesEnabled(): |
| return preferences().GetBool(EnableAdvancedOCLFeatures, False) |
|
|
|
|
| def experimentalFeaturesEnabled(): |
| return preferences().GetBool(EnableExperimentalFeatures, False) |
|
|
|
|
| def suppressAllSpeedsWarning(): |
| return preferences().GetBool(WarningSuppressAllSpeeds, True) |
|
|
|
|
| def suppressRapidSpeedsWarning(user=True): |
| return (user and suppressAllSpeedsWarning()) or preferences().GetBool( |
| WarningSuppressRapidSpeeds, True |
| ) |
|
|
|
|
| def suppressSelectionModeWarning(): |
| return preferences().GetBool(WarningSuppressSelectionMode, True) |
|
|
|
|
| def suppressOpenCamLibWarning(): |
| return preferences().GetBool(WarningSuppressOpenCamLib, True) |
|
|
|
|
| def suppressVelocity(): |
| return preferences().GetBool(WarningSuppressVelocity, False) |
|
|
|
|
| def setPreferencesAdvanced(ocl, warnSpeeds, warnRapids, warnModes, warnOCL, warnVelocity): |
| preferences().SetBool(EnableAdvancedOCLFeatures, ocl) |
| preferences().SetBool(WarningSuppressAllSpeeds, warnSpeeds) |
| preferences().SetBool(WarningSuppressRapidSpeeds, warnRapids) |
| preferences().SetBool(WarningSuppressSelectionMode, warnModes) |
| preferences().SetBool(WarningSuppressOpenCamLib, warnOCL) |
| preferences().SetBool(WarningSuppressVelocity, warnVelocity) |
|
|