Skip to content
Draft
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a2f99d3
feat: adding design check tab to exporter
Dhruv-0-Arora Jul 8, 2025
066e38c
feat: adding height and perimeter rule checks
Dhruv-0-Arora Jul 14, 2025
4fa43c8
feat: adding DRC UI
Dhruv-0-Arora Jul 14, 2025
a968146
Merging Dev
Dhruv-0-Arora Jul 18, 2025
5021b5b
fix: formatting and mypy
Dhruv-0-Arora Jul 18, 2025
cecb5d9
formatting
Dhruv-0-Arora Jul 18, 2025
fbd2574
Merge branch 'dev' into dhruv/1882/drc-ui-support
Dhruv-0-Arora Jul 18, 2025
b0df31b
feat: adding table with icons showing validity
Dhruv-0-Arora Jul 18, 2025
fe3e116
Merging Local
Dhruv-0-Arora Jul 18, 2025
6d2e608
feat: adding invalid and proper perimeter validation
Dhruv-0-Arora Jul 18, 2025
140645b
formatting
Dhruv-0-Arora Jul 18, 2025
c8d5c60
Merge branch 'dev' into dhruv/1882/drc-ui-support
PepperLola Jul 19, 2025
5e46d91
fix: removing orientedboundingbox
Dhruv-0-Arora Jul 23, 2025
00b1242
Merging Dev
Dhruv-0-Arora Jul 23, 2025
9130b8a
feat: adding extensibility
Dhruv-0-Arora Jul 23, 2025
1a5eb20
fix: formatting
Dhruv-0-Arora Jul 23, 2025
5ad15c1
fix: mypy
Dhruv-0-Arora Jul 23, 2025
1cb1f5c
feat: typing and resolving mypy
Dhruv-0-Arora Jul 24, 2025
6aee78b
feat: changing calculations using different orientations of the bound…
Dhruv-0-Arora Jul 24, 2025
134b42f
Merging Dev and Formatting
Dhruv-0-Arora Jul 25, 2025
e031d0b
Merging Dev
Dhruv-0-Arora Jul 30, 2025
e9e3f49
feat: adding web tab
Dhruv-0-Arora Jul 30, 2025
fe2327f
feat: sending designRuleChecks to web-based UI
Dhruv-0-Arora Aug 1, 2025
efcfde1
feat: adding json dumps and fixing callable functions
Dhruv-0-Arora Aug 4, 2025
f43d4e5
merging dev
Dhruv-0-Arora Aug 6, 2025
b05fd8e
fix: conflicts
Dhruv-0-Arora Aug 6, 2025
77f852b
fix: table not displaying on tab
Dhruv-0-Arora Aug 7, 2025
af430a8
feat: adding validation header
Dhruv-0-Arora Aug 7, 2025
0fe4a98
fix: biome errors and formatting
Dhruv-0-Arora Aug 7, 2025
01abb79
fix: sendData run when window is undefined
Dhruv-0-Arora Aug 19, 2025
8d4b88d
Merge branch 'dev' into dhruv/1882/drc-ui-support
Dhruv-0-Arora Aug 19, 2025
9fd087d
fix: removing redundant state implementation
Dhruv-0-Arora Aug 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import adsk.fusion

import src.Parser.SynthesisParser.Parser as Parser
import src.UI.DesignCheckTab as DesignCheckTab
import src.UI.GamepieceConfigTab as GamepieceConfigTab
import src.UI.GeneralConfigTab as GeneralConfigTab
import src.UI.JointConfigTab as JointConfigTab
Expand All @@ -27,6 +28,7 @@
generalConfigTab: GeneralConfigTab.GeneralConfigTab
jointConfigTab: JointConfigTab.JointConfigTab
gamepieceConfigTab: GamepieceConfigTab.GamepieceConfigTab
designCheckTab: DesignCheckTab.DesignCheckTab
taggingConfigTab: TaggingConfigTab.TaggingConfigTab

INPUTS_ROOT: adsk.core.CommandInputs
Expand All @@ -39,6 +41,7 @@ def reload() -> None:
importlib.reload(GeneralConfigTab)
importlib.reload(GamepieceConfigTab)
importlib.reload(JointConfigTab)
importlib.reload(DesignCheckTab)
importlib.reload(TaggingConfigTab)

importlib.reload(Parser)
Expand Down Expand Up @@ -95,6 +98,10 @@ def notify(self, args: adsk.core.CommandCreatedEventArgs) -> None:
jointConfigTab = JointConfigTab.JointConfigTab(args)
generalConfigTab.jointConfigTab = jointConfigTab

global designCheckTab
designCheckTab = DesignCheckTab.DesignCheckTab(args)
generalConfigTab.designCheckTab = designCheckTab

global taggingConfigTab
taggingConfigTab = TaggingConfigTab.TaggingConfigTab(args)
generalConfigTab.taggingConfigTab = taggingConfigTab
Expand Down
98 changes: 98 additions & 0 deletions exporter/SynthesisFusionAddin/src/UI/DesignCheckTab.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
from typing import Any, Callable, Dict, List, TypedDict, cast

import adsk.core
import adsk.fusion

from src import Logging, gm
from src.UI import IconPaths

logger = Logging.getLogger()

class DesignRule(TypedDict):
name: str
calculation: Callable[[], float]
max_value: float


class DesignCheckTab:
designCheckTab: adsk.core.TabCommandInput
designCheckTable: adsk.core.TableCommandInput
designRules: Dict[str, Any] = {}
design_rules: List[DesignRule]

@Logging.logFailure
def __init__(self, args: adsk.core.CommandCreatedEventArgs) -> None:
self.designCheckTab = args.command.commandInputs.addTabCommandInput("designCheckTab", "Design Rule Check")
designCheckTabInputs = self.designCheckTab.children

# Create the table for design checks
self.designCheckTable = designCheckTabInputs.addTableCommandInput(
"designCheckTable", "Design Checks", 3, "3:2:2"
)
self.designCheckTable.tablePresentationStyle = (
adsk.core.TablePresentationStyles.itemBorderTablePresentationStyle
)

# Define and add design rules to the table
self.design_rules = [
{
"name": "Design Height",
"calculation": self.fusion_design_height,
"max_value": 106.0, # cm
},
{
"name": "Design Perimeter",
"calculation": self.fusion_design_perimeter,
"max_value": 304.0, # cm
},
]

for i, rule in enumerate(self.design_rules):
calculation = rule["calculation"]
max_value: float = rule["max_value"]
value: float = calculation()
is_valid: bool = value <= max_value
rule_name: str = str(rule["name"])
rule_id: str = rule_name.replace(" ", "")

name_input = designCheckTabInputs.addTextBoxCommandInput(f"{rule_id}Name", rule_name, rule_name, 1, True)
value_input = designCheckTabInputs.addTextBoxCommandInput(
f"{rule_id}Value", "Value", f"{value:.2f} cm", 1, True
)
icon_input = designCheckTabInputs.addImageCommandInput(
f"{rule_id}StatusIcon",
"",
IconPaths.designCheckIcons["valid"] if is_valid else IconPaths.designCheckIcons["invalid"],
)

self.designCheckTable.addCommandInput(name_input, i, 0)
self.designCheckTable.addCommandInput(value_input, i, 1)
self.designCheckTable.addCommandInput(icon_input, i, 2)

@property
def isVisible(self) -> bool:
return self.designCheckTab.isVisible or False

@isVisible.setter
def isVisible(self, value: bool) -> None:
self.designCheckTab.isVisible = value

@property
def isActive(self) -> bool:
return self.designCheckTab.isActive or False

@Logging.logFailure
def fusion_design_height(self) -> float:
design = adsk.fusion.Design.cast(gm.app.activeProduct)
if design:
overall_bounding_box = design.rootComponent.orientedMinimumBoundingBox
return float(overall_bounding_box.width)
return 0.0

@Logging.logFailure
def fusion_design_perimeter(self) -> float:
design = adsk.fusion.Design.cast(gm.app.activeProduct)
if design:
overall_bounding_box = design.rootComponent.orientedMinimumBoundingBox
return float(2 * (overall_bounding_box.height + overall_bounding_box.length))
return 0.0
2 changes: 2 additions & 0 deletions exporter/SynthesisFusionAddin/src/UI/GeneralConfigTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from src.Parser.ExporterOptions import ExporterOptions
from src.Types import KG, ExportLocation, ExportMode, UnitSystem
from src.UI.CreateCommandInputsHelper import createBooleanInput
from src.UI.DesignCheckTab import DesignCheckTab
from src.UI.GamepieceConfigTab import GamepieceConfigTab
from src.UI.JointConfigTab import JointConfigTab
from src.UI.TaggingConfigTab import TaggingConfigTab
Expand All @@ -24,6 +25,7 @@ class GeneralConfigTab:
previousSelectedModeDropdownIndex: int
jointConfigTab: JointConfigTab
gamepieceConfigTab: GamepieceConfigTab
designCheckTab: DesignCheckTab
taggingConfigTab: TaggingConfigTab

@logFailure
Expand Down
5 changes: 5 additions & 0 deletions exporter/SynthesisFusionAddin/src/UI/IconPaths.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@
"friction_override-enabled": resources + os.path.join("FrictionOverride_icon"), # resource folder
}

designCheckIcons = {
"valid": resources + os.path.join("DesignCheckIcons", "valid-preview93x18.png"),
"invalid": resources + os.path.join("DesignCheckIcons", "invalid-preview112x18.png"),
}

tagIcons = {
"blank": resources + "blank-preview16x16.png",
}
Loading