├── .gitattributes ├── .gitignore ├── LICENSE ├── PyInventor ├── __init__.py └── pyinvent.py ├── README.md ├── _Tutorial_Notebooks ├── 00000_arc_test.stp ├── 00001_arc_test.stp ├── 3DMM Demo.ipt ├── 3DMM Demo.stp ├── Cavity Lattice Demo.ipt ├── Cavity Lattice Demo.stp ├── Coax Demo.ipt ├── Coax Demo.stp ├── Cylindrical Flute Demo.ipt ├── Cylindrical Flute Demo.stp ├── Half Off-Axis Donut Revolve Demo.ipt ├── Half Off-Axis Donut Revolve Demo.stp ├── Pictures │ └── PyInventor Workflow.png ├── PyInventor Demo.ipynb ├── arc_test.ipt ├── arc_test.stp └── lockfile.lck ├── requirements.txt └── setup.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # celery beat schedule file 95 | celerybeat-schedule 96 | 97 | # SageMath parsed files 98 | *.sage.py 99 | 100 | # Environments 101 | .env 102 | .venv 103 | env/ 104 | venv/ 105 | ENV/ 106 | env.bak/ 107 | venv.bak/ 108 | 109 | # Spyder project settings 110 | .spyderproject 111 | .spyproject 112 | 113 | # Rope project settings 114 | .ropeproject 115 | 116 | # mkdocs documentation 117 | /site 118 | 119 | # mypy 120 | .mypy_cache/ 121 | .dmypy.json 122 | dmypy.json 123 | 124 | # Pyre type checker 125 | .pyre/ 126 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Andrew Oriani 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PyInventor/__init__.py: -------------------------------------------------------------------------------- 1 | ############################################################################## 2 | # Python header 3 | 4 | __author__ = "Andrew Oriani" 5 | __copyright__ = "Copyright 2020" 6 | __credits__ = ["Andrew E. Oriani"] 7 | __license__ = "BSD-3-Clause" 8 | __version__ = "0.4" 9 | __maintainer__ = "Andrew Oriani Schusterlab" 10 | __email__ = "oriani@uchicago.edu" 11 | __url__ = r'schusterlab.uchicago.edu' 12 | __status__ = "Dev-Production" 13 | 14 | ############################################################################## 15 | #Checks module compatibility 16 | try: 17 | import glob 18 | del glob 19 | except (ImportError, ModuleNotFoundError): 20 | print('Glob module not installed, install glob module using: $ conda install -c conda-forge glob ') 21 | 22 | try: 23 | import xlwings 24 | del xlwings 25 | except (ImportError, ModuleNotFoundError): 26 | print('Xlwings module not installed, install glob module using: $ conda install -c conda-forge xlwings ') 27 | 28 | from . import pyinvent 29 | from .pyinvent import com_obj, structure, iPart, arc_pattern, circle_pattern 30 | 31 | __all__=['pyinvent', 'com_obj', 'structure', 'iPart', 'arc_pattern', 'circle_pattern'] 32 | -------------------------------------------------------------------------------- /PyInventor/pyinvent.py: -------------------------------------------------------------------------------- 1 | import glob 2 | from win32com.client import Dispatch, GetActiveObject, gencache, constants 3 | import numpy as np 4 | from numpy import cos, sin, pi, sqrt 5 | import os 6 | import copy 7 | import xlwings as xw 8 | import warnings 9 | import re 10 | import sys 11 | import shutil 12 | from scipy.special import binom 13 | 14 | ''' 15 | 16 | This version 4 of the inventor API for python creates a new com_obj class that is used for the initialization 17 | of the com port and the inventor object 18 | 19 | Previous versions: 20 | 21 | Verion 3 of the Inventor API for Python. This updates the drawing functionality, adds a revolve feature, 22 | sketch slots, sketch circles, object collection functionality, and generally streamlines the part creation process. 23 | Added a view manager that allows for view style and camera placement 24 | 25 | Command list can be found at : 26 | http://help.autodesk.com/view/INVNTOR/2019/ENU/ 27 | 28 | Written by: Andrew Oriani 29 | 9/21/2020 30 | 31 | ''' 32 | 33 | def clear_excel_app_data(): 34 | try: 35 | xw = gencache.EnsureDispatch('Excel.Application') 36 | except AttributeError: 37 | # Remove cache and try again. 38 | MODULE_LIST = [m.__name__ for m in sys.modules.values()] 39 | for module in MODULE_LIST: 40 | if re.match(r'win32com\.gen_py\..+', module): 41 | del sys.modules[module] 42 | shutil.rmtree(os.path.join(os.environ.get('LOCALAPPDATA'), 'Temp', 'gen_py')) 43 | xw = gencache.EnsureDispatch('Excel.Application') 44 | xw.Quit() 45 | 46 | 47 | class com_obj(object): 48 | def __init__(self): 49 | ''' 50 | Attempts to open inventor and setup com port 51 | ''' 52 | try: 53 | self.invApp = GetActiveObject('Inventor.Application') 54 | except: 55 | self.invApp = Dispatch('Inventor.Application') 56 | self.invApp.Visible = True 57 | 58 | self.mod = gencache.EnsureModule('{D98A091D-3A0F-4C3E-B36E-61F62068D488}', 0, 1, 0) 59 | self.invAppCom = self.mod.Application(self.invApp) 60 | 61 | 62 | def overwrite_file(self, path, prefix): 63 | ''' 64 | Overwrites existing file name 65 | ''' 66 | if os.path.isfile(path+'\\'+prefix)==True: 67 | self.invApp.Documents.CloseAll() 68 | os.remove(path+'\\'+prefix) 69 | else: 70 | pass 71 | 72 | def new_part(self, prefix='', path=''): 73 | ''' 74 | Generates new part document 75 | ''' 76 | 77 | if prefix=='': 78 | self.invDoc = self.invApp.Documents.Add(constants.kPartDocumentObject, "", True) 79 | else: 80 | #check if input filename exists, if so, modify 81 | if os.path.isfile(path+'\\'+prefix)==True: 82 | try: 83 | self.invDoc=self.invApp.Documents.Open(path+'\\'+prefix) 84 | except: 85 | raise Exception('ERROR: Unable to open file, check filetype and if file is in target directory.') 86 | if self.invDoc.DocumentType==constants.kPartDocumentObject: 87 | pass 88 | else: 89 | raise Exception('ERROR: Document type is not part document') 90 | else: 91 | self.invDoc = self.invApp.Documents.Add(constants.kPartDocumentObject, "", True) 92 | 93 | # Casting Document to PartDocument 94 | self.invPartDoc = self.mod.PartDocument(self.invDoc) 95 | self.compdef = self.invPartDoc.ComponentDefinition 96 | 97 | #Opened document handle 98 | self.oDoc=self.invAppCom.ActiveDocument 99 | 100 | #create command manager 101 | self.cmdManager=self.invApp.CommandManager 102 | 103 | #Set transient geometry object 104 | self.tg=self.invApp.TransientGeometry 105 | self.trans_obj=self.invApp.TransientObjects 106 | 107 | #object view handle 108 | self.view=self.invApp.ActiveView 109 | 110 | def close_all_parts(self): 111 | self.invApp.Documents.CloseAll() 112 | 113 | 114 | 115 | class iPart(com_obj): 116 | def __init__(self, path='', prefix='', units='imperial', overwrite=True): 117 | 118 | self.overwrite=overwrite 119 | self.file_path=path 120 | self.f_name=prefix 121 | self.units=units 122 | 123 | try: 124 | self.thread_tables=glob.glob('C:\\Users\\Public\\Documents\\Autodesk\\Inventor 20*')[0]+'\\Design Data\\XLS\\en-US\\thread.xls' 125 | except: 126 | warnings.warn('Unable to locate thread tables, wont be able to create thread feature') 127 | self.thread_tables=[] 128 | #setup com with inventor 129 | super(iPart, self).__init__() 130 | 131 | if overwrite==True: 132 | self.overwrite_file(path, prefix) 133 | elif overwrite==False: 134 | pass 135 | 136 | #open part or setup new part 137 | self.new_part(prefix, path) 138 | 139 | #set document units 140 | self.set_units(units) 141 | 142 | 143 | #set file name and handle 144 | self.f_name=prefix 145 | self.file_path=path 146 | 147 | #instantiate sketch, extrusion, and hole feature counters 148 | #sketch 149 | self.sketch_num=0 150 | self.sketch_list=[] 151 | #extrusion 152 | self.extrude_num=0 153 | self.extrude_list=[] 154 | #hole 155 | self.hole_num=0 156 | self.hole_list=[] 157 | #workplanes 158 | self.plane_num=0 159 | self.plane_list=[] 160 | 161 | 162 | class sketch: 163 | def __init__(self, sketch_obj, sketch_num, plane): 164 | self.sketch_num=sketch_num 165 | self.sketch_obj=sketch_obj 166 | self.plane=plane 167 | 168 | def edit(self): 169 | self.sketch_obj.Edit() 170 | 171 | def exit_edit(self): 172 | self.sketch_obj.ExitEdit() 173 | 174 | class extrusion: 175 | def __init__(self, extrude_obj, extrude_num): 176 | self.extrude_obj=extrude_obj 177 | self.extrude_num=extrude_num 178 | 179 | class planes: 180 | def __init__(self, plane_obj, plane_num): 181 | self.plane_obj=plane_obj 182 | self.plane_num=plane_num 183 | 184 | class hole: 185 | def __init__(self, hole_obj, hole_num): 186 | self.hole_obj=hole_obj 187 | self.hole_num=hole_num 188 | 189 | def set_visual_style(self, shaded=True, edges=True, hidden_edges=False, realistic=False): 190 | if realistic==False: 191 | if shaded==True: 192 | if edges==False: 193 | val=8708 194 | else: 195 | if hidden_edges==True: 196 | val=8707 197 | else: 198 | val=8710 199 | else: 200 | if edges==True: 201 | if hidden_edges==True: 202 | val=8712 203 | else: 204 | val=8711 205 | else: 206 | val=8706 207 | else: 208 | val=8709 209 | self.view.DisplayMode=val 210 | 211 | def f_check(self, path, f_name): 212 | if path[-1]!='\\': 213 | path=path+'\\' 214 | dirlist = glob.glob(path+'*'+f_name) 215 | if dirlist!=[]: 216 | return True 217 | elif dirlist==[]: 218 | return False 219 | 220 | def SP_check(self, obj): 221 | obj_type=self.API_type(obj) 222 | if obj_type=='SketchPoint': 223 | return True 224 | elif obj_type!='SketchPoint': 225 | return False 226 | else: 227 | raise Exception('ERROR: Object input is invalid') 228 | 229 | def API_type(self, obj): 230 | #check what the API object type is 231 | return str(type(obj)).split(' ')[-1].split('.')[-1].split('\'')[0] 232 | 233 | def object_check(self, obj): 234 | #checks if obj is valid Inventor Object 235 | try: 236 | return str(obj).split(' ')[1]+' '+str(obj).split(' ')[2] 237 | except: 238 | pass 239 | try: 240 | return str(type(obj)).split(' ')[1]+' '+str(type(obj)).split(' ')[2] 241 | except: 242 | pass 243 | 244 | return self.API_type(obj) 245 | 246 | def copy_file_ext_types(self): 247 | return ['stp', 'stl', 'step', 'stpz', 'ste', 'ipt', 'igs', 'ige', 'iges'] 248 | 249 | def save(self, file_path='', file_name=''): 250 | #save file in requisite path, if copy flag is set it saves a numbered copy of the original file 251 | if file_name=='' and self.f_name!='': 252 | file_name=self.f_name 253 | elif self.f_name=='': 254 | raise Exception('ERROR: Need filename for .ipt file') 255 | if file_path=='' and self.file_path!='': 256 | file_path=self.file_path 257 | elif file_path=='' and self.file_path=='': 258 | file_path=os.getcwd() 259 | 260 | check=self.f_check(file_path, file_name) 261 | 262 | if check==True: 263 | file_name=get_next_filename(file_path, file_name) 264 | else: 265 | pass 266 | 267 | full_path=file_path+'\\'+file_name 268 | 269 | if os.path.isfile(full_path)==True and self.overwrite==False: 270 | self.invDoc.Save() 271 | else: 272 | self.invDoc.SaveAs(full_path, SaveCopyAs=False) 273 | 274 | return full_path 275 | 276 | def save_copy_as(self, copy_name='', file_path='', copy_as=''): 277 | 278 | suffix=copy_as 279 | 280 | if file_path=='' and self.file_path!='': 281 | file_path=self.file_path 282 | elif file_path=='' and self.file_path=='': 283 | file_path=os.getcwd() 284 | 285 | if copy_name=='' and self.f_name!='': 286 | copy_name=self.f_name 287 | else: 288 | pass 289 | 290 | file_type=copy_name.split('.')[-1] 291 | if suffix!='' and file_type!=suffix: 292 | if suffix in self.copy_file_ext_types() and file_type in self.copy_file_ext_types(): 293 | copy_name=copy_name.split('.')[0]+'.'+suffix 294 | else: 295 | raise Exception('ERROR: Not a valid filetype, must be stp, stl, ipt, or igs file extension') 296 | else: 297 | pass 298 | 299 | if self.f_check(file_path, copy_name)==True: 300 | copy_name=get_next_filename(file_path, copy_name) 301 | else: 302 | pass 303 | 304 | full_path=file_path+'\\'+copy_name 305 | 306 | self.invDoc.SaveAs(full_path, SaveCopyAs=True) 307 | 308 | print('File successfully copied as: %s'%(full_path)) 309 | 310 | return full_path 311 | 312 | def set_units(self, units='imperial'): 313 | if units=='imperial': 314 | angle=constants.kDegreeAngleUnits 315 | length=constants.kInchLengthUnits 316 | elif units=='metric': 317 | angle=constants.kRadianAngleUnits 318 | length=constants.kMillimeterLengthUnits 319 | else: 320 | raise Exception('ERROR: Invalid units input, must be imperial or metric') 321 | self.invDoc.UnitsOfMeasure.LengthUnits=length 322 | self.invDoc.UnitsOfMeasure.AngleUnits=angle 323 | self.invDoc.Rebuild 324 | self.units=units 325 | 326 | def unit_conv(self, val_in): 327 | units=self.units 328 | if units=='imperial': 329 | mult=2.54 330 | elif units=='metric': 331 | mult=.1 332 | 333 | if type(val_in)==np.float64 or type(val_in)==float or type(val_in)==int: 334 | return mult*val_in 335 | elif type(val_in)!=list or type(val_in)==tuple: 336 | return tuple(mult*np.array(val_in)) 337 | elif type(val_in)==list: 338 | if type(val_in[0])==tuple and len(val_in[0])==2: 339 | for I, vals in enumerate(val_in): 340 | vals=list(vals) 341 | vals[0]=vals[0]*mult 342 | vals[1]=vals[1]*mult 343 | val_in[I]=tuple(vals) 344 | else: 345 | raise Exception('ERROR: input list not a tuples or len is not equal to 2') 346 | return val_in 347 | 348 | def inv_unit_conv(self, val_in): 349 | units=self.units 350 | if units=='imperial': 351 | mult=2.54 352 | elif units=='metric': 353 | mult=.1 354 | 355 | if type(val_in)==np.float64 or type(val_in)==float or type(val_in)==int: 356 | return val_in/mult 357 | elif type(val_in)!=list or type(val_in)==tuple: 358 | return tuple(np.array(val_in)/mult) 359 | elif type(val_in)==list: 360 | if type(val_in[0])==tuple and len(val_in[0])==2: 361 | for I, vals in enumerate(val_in): 362 | vals=list(vals) 363 | vals[0]=vals[0]/mult 364 | vals[1]=vals[1]/mult 365 | val_in[I]=tuple(vals) 366 | else: 367 | raise Exception('ERROR: input list not a tuples or len is not equal to 2') 368 | return val_in 369 | 370 | def ang_conv(self, val_in): 371 | units=self.units 372 | if units=='imperial': 373 | mult=np.pi/180 374 | elif units=='metric': 375 | mult=1 376 | return val_in*mult 377 | 378 | def close(self, save=True): 379 | #close the inventor part document 380 | if save==True: 381 | self.invPartDoc.Close(SkipSave=False) 382 | elif save==False: 383 | self.invPartDoc.Close(SkipSave=True) 384 | else: 385 | raise Exception('ERROR: Invalid save input, must be boolean') 386 | 387 | def thread_gen(self, dia, pitch, thread_type='unified', thread_class=''): 388 | 389 | #open native inventor thread tables with thread designators 390 | 391 | if self.thread_tables==[]: 392 | raise Exception('ERROR: Unable to find native inventor thread tables.') 393 | 394 | try: 395 | thread_tables_path=self.thread_tables 396 | try: 397 | xw.App(visible=False) 398 | except: 399 | clear_excel_app_data() 400 | xw.App(visible=False) 401 | 402 | thread_tables=xw.Book(thread_tables_path) 403 | 404 | if thread_type=='unified' or thread_type=='imperial': 405 | thread_type='ANSI Unified Screw Threads' 406 | split_ele='-' 407 | if thread_class=='': 408 | thread_class='2B' 409 | else: 410 | pass 411 | elif thread_type=='metric': 412 | dia='M'+dia 413 | split_ele='x' 414 | thread_type='ANSI Metric M Profile' 415 | if pitch.split('.')[0]=='': 416 | pitch='0'+pitch 417 | else: 418 | pass 419 | if thread_class=='': 420 | thread_class='6H' 421 | else: 422 | pass 423 | 424 | thread_sheet=thread_tables.sheets[thread_type] 425 | thread_des=thread_sheet.api.UsedRange.Find('Thread Designation').GetAddress() 426 | except: 427 | raise Exception('ERROR: Unable to open native inventor thread tables.') 428 | 429 | #conduct search of thread tables for single listing 430 | class_col='N' 431 | 432 | row_col=thread_des.split('$')[1::] 433 | row_start=int(row_col[1])+1 434 | row=row_start 435 | col=row_col[0] 436 | while thread_sheet.range('%s%s'%(col, str(row))).value!=None: 437 | row+=1 438 | pass 439 | 440 | tap_list=thread_sheet.range('%s%s:%s%s'%(col, str(row_start), col, str(row-1))).value 441 | class_list=thread_sheet.range('%s%s:%s%s'%(class_col, str(row_start), class_col, str(row-1))).value 442 | 443 | #make sure to fully close table 444 | thread_tables.close() 445 | 446 | dia_indices = [i for i, elem in enumerate(tap_list) if dia in elem.split(split_ele)[0][0:len(dia)] and len(elem.split(split_ele)[0])==len(dia)] 447 | 448 | if dia_indices==[]: 449 | raise Exception('ERROR: Invalid value for hole diameter') 450 | else: 451 | pass 452 | 453 | dia_vals=[np.array(tap_list)[dia_indices].tolist(), dia_indices] 454 | 455 | pitch_indices=[dia_indices[i] for i, elem in enumerate(dia_vals[0]) if pitch in elem.split(split_ele)[1]] 456 | 457 | if pitch_indices==[]: 458 | raise Exception('ERROR: Invalid value for thread pitch') 459 | else: 460 | pass 461 | 462 | thread_input=[] 463 | for inds in pitch_indices: 464 | thread_input.append([tap_list[inds], class_list[inds]]) 465 | 466 | thread_input=[thread_input[1][i] for i, elem in enumerate(thread_input) if elem[1]!=None and thread_class in elem[1]] 467 | 468 | if thread_input==[] or len(thread_input)>1: 469 | raise Exception('ERROR: Invalid thread class') 470 | 471 | return thread_input[0], thread_type, thread_class 472 | 473 | def pick(self, feature='planes'): 474 | feature_vals={'points':{'msg': 'Pick Points', 'enum': constants.kAllPointEntities}, 475 | 'planes':{'msg': 'Pick Planes', 'enum': constants.kWorkPlaneFilter}, 476 | 'linear':{'msg': 'Pick Line Elements', 'enum': constants.kAllLinearEntities}, 477 | 'circular':{'msg': 'Pick Circular Elements', 'enum': constants.kAllCircularEntities}, 478 | 'sketch':{'msg': 'Pick Sketch', 'enum': constants.kSketchObjectFilter}, 479 | 'face':{'msg': 'Pick Face', 'enum': constants.kPartFacePlanarFilter} 480 | } 481 | if feature in feature_vals.keys(): 482 | pass 483 | else: 484 | raise Exception('ERROR: Invalid feature descriptor (points, planes, linear, circular, sketch) elements') 485 | 486 | enum=feature_vals[feature]['enum'] 487 | msg=feature_vals[feature]['enum'] 488 | return self.cmdManager.Pick(enum, msg) 489 | 490 | def pick_point(self): 491 | point=self.pick(feature='points') 492 | return point 493 | 494 | def pick_plane(self): 495 | plane=self.pick(feature='planes') 496 | return plane 497 | 498 | def pick_sketch(self): 499 | sketch=self.pick(feature='sketch') 500 | return sketch 501 | 502 | def pick_line(self): 503 | return self.pick(feature='linear') 504 | 505 | 506 | def pick_circle(self): 507 | return self.pick(feature='circular') 508 | 509 | 510 | def pick_face(self): 511 | return self.pick(feature='face') 512 | 513 | 514 | def copy_sketch(self, sketch): 515 | sketch_obj, sketch_num, _=self.sketch_test(sketch) 516 | if self.API_type(sketch_obj)=='PlanarSketch': 517 | pass 518 | else: 519 | raise Exception('ERROR: Not valid sketch type') 520 | sketchCopy=self.compdef.Sketches.Item(sketch_num) 521 | self.oDoc.SelectSet.Clear() 522 | self.oDoc.SelectSet.Select(sketchCopy) 523 | self.copy() 524 | self.paste() 525 | 526 | def sketch_test(self, sketch): 527 | try: 528 | sketch_obj=sketch.sketch_obj 529 | sketch_num=sketch.sketch_num 530 | plane=sketch.plane 531 | return sketch_obj, sketch_num, plane 532 | except: 533 | raise Exception('ERROR: Invalid target sketch object') 534 | 535 | 536 | def copy_paste_sketch(self, target_sketch, sketch): 537 | sketch_obj, sketch_num=self.sketch_test(target_sketch) 538 | self.copy_sketch(sketch) 539 | sketch_obj.Edit() 540 | self.paste() 541 | sketch_obj.ExitEdit() 542 | 543 | def copy(self): 544 | copy_def=self.cmdManager.ControlDefinitions.Item("AppCopyCmd") 545 | copy_def.Execute() 546 | 547 | def paste(self): 548 | paste_def=self.cmdManager.ControlDefinitions.Item("AppPasteCmd") 549 | paste_def.Execute() 550 | 551 | 552 | def add_workplane(self, plane='xy', offset=None): 553 | if offset==None: 554 | offset=0 555 | else: 556 | offset=self.unit_conv(offset) 557 | if type(plane)==str: 558 | if plane=='xy': 559 | plane='XY Plane' 560 | elif plane=='xz': 561 | plane='XZ Plane' 562 | elif plane=='yz': 563 | plane='YZ Plane' 564 | else: 565 | raise Exception('ERROR: Invalid plane desciptor, (xy, xz, yz)') 566 | plane=self.compdef.WorkPlanes.Item(plane) 567 | elif self.API_type(plane)=='Face': 568 | pass 569 | else: 570 | raise Exception('ERROR: Invalid input, must be face/planar object or coordinate system (xy, xz, yz)') 571 | return self.add_offset_workplane(plane, offset) 572 | 573 | def add_offset_workplane(self, plane, offset, construction=True): 574 | self.plane_num+=1 575 | self.plane_list.append(self.plane_num) 576 | plane_obj=self.compdef.WorkPlanes.AddByPlaneAndOffset(plane, offset, construction) 577 | return self.planes(plane_obj, self.plane_num) 578 | 579 | def new_sketch(self, plane): 580 | self.sketch_num+=1 581 | self.sketch_list.append(self.sketch_num) 582 | return self.sketch(self.compdef.Sketches.Add(plane.plane_obj), self.sketch_num, plane) 583 | 584 | def delete_sketch(self, sketch): 585 | sketch_obj, sketch_num, _=self.sketch_test(sketch) 586 | self.sketch_list.remove(sketch_num) 587 | sketch_obj.Delete() 588 | 589 | def two_point_centered_rect(self, sketch, center, corner): 590 | sketch=sketch.sketch_obj 591 | rect_obj=sketch.SketchLines.AddAsTwoPointCenteredRectangle(self.point(center), self.point(corner)) 592 | rect_obj_coll=self.new_obj_collection() 593 | return rect_obj_coll.Add(rect_obj) 594 | 595 | 596 | def sketch_point(self, sketch, pos): 597 | sketch_obj=sketch.sketch_obj 598 | return sketch_obj.SketchPoints.Add(self.point(pos)) 599 | 600 | def sketch_point_coll(self, sketch, pos): 601 | sketch_obj=sketch.sketch_obj 602 | if pos==[] or type(pos)!=list: 603 | raise Exception('ERROR: Must be a list of tuples representing points') 604 | else: 605 | pass 606 | points=[] 607 | for coords in pos: 608 | points.append(self.sketch_point(sketch, coords)) 609 | return self.create_obj_collection(points) 610 | 611 | def two_point_rect(self, sketch, corner_1, corner_2): 612 | rect_obj=sketch.SketchLines.AddAsTwoPointRectangle(self.point(corner_1), self.point(corner_2)) 613 | rect_obj_coll=self.new_obj_collection() 614 | return rect_obj_coll.Add(rect_obj) 615 | 616 | def sketch_circle(self, sketch, center, radius): 617 | sketch=sketch.sketch_obj 618 | circle=sketch.SketchCircles.AddByCenterRadius(self.point(center), self.unit_conv(radius)) 619 | circle_obj=self.new_obj_collection() 620 | circle_obj.Add(circle) 621 | return circle_obj 622 | 623 | def sketch_slot(self, sketch, start, end, width, overall_length=False): 624 | sketch=sketch.sketch_obj 625 | if overall_length==True: 626 | slot=sketch.AddStraightSlotByOverall(self.point(start), self.point(end), self.unit_conv(width)) 627 | elif overall_length==False: 628 | slot=sketch.AddStraightSlotByCenterToCenter(self.point(start), self.point(end), self.unit_conv(width)) 629 | 630 | slot_obj=self.new_obj_collection() 631 | for I in range(1,slot.Count): 632 | slot_obj.Add(slot.Item(I)) 633 | 634 | return slot_obj 635 | 636 | def sketch_center_slot(self, sketch, center, end, width): 637 | sketch=sketch.sketch_obj 638 | slot=sketch.AddStraightSlotBySlotCenter(self.point(center), self.point(end), self.unit_conv(width)) 639 | 640 | slot_obj=self.new_obj_collection() 641 | for I in range(1,slot.Count): 642 | slot_obj.Add(slot.Item(I)) 643 | return slot_obj 644 | 645 | def point(self, pos): 646 | self.tg=self.invApp.TransientGeometry 647 | if self.SP_check(pos)==False: 648 | if type(pos)!=tuple and type(pos)!=list: 649 | raise Exception('ERROR: Point position must be list of form [x,y]') 650 | elif len(pos)!=2: 651 | raise Exception('ERROR: Point position must be len=2 list') 652 | else: 653 | return self.tg.CreatePoint2d(self.unit_conv(pos[0]), self.unit_conv(pos[1])) 654 | elif self.SP_check(pos)==True: 655 | return pos 656 | else: 657 | raise Exception('Position must be object endpoint or [x,y] position') 658 | 659 | def undo(self): 660 | undoDef=self.cmdManager.ControlDefinitions.Item("AppUndoCmd") 661 | undoDef.Execute() 662 | 663 | def extrude(self, sketch, thickness, obj_collection=None, direction='positive', operation='join'): 664 | sketch_obj, sketch_num, _=self.sketch_test(sketch) 665 | sketch=sketch_obj 666 | self.extrude_num+=1 667 | self.extrude_list.append(self.extrude_num) 668 | if operation=='join': 669 | op=constants.kJoinOperation 670 | elif operation=='intersect': 671 | op=constants.kIntersectOperation 672 | elif operation=='cut': 673 | op=constants.kCutOperation 674 | elif operation=='new_form': 675 | op=constants.kNewBodyOperation 676 | elif operation=='surface': 677 | op=constants.kSurfaceOperation 678 | else: 679 | raise Exception('ERROR: Operation must be either join, cut, intersect, new_form, or surface.') 680 | 681 | if direction=='positive': 682 | extrude_dir=constants.kPositiveExtentDirection 683 | elif direction=='negative': 684 | extrude_dir=constants.kNegativeExtentDirection 685 | elif direction=='symmetric': 686 | extrude_dir=constants.kSymmetricExtentDirection 687 | else: 688 | raise Exception('ERROR: Extrude direction must be positive, negative, or symmetric') 689 | if obj_collection==None: 690 | profile=sketch.Profiles.AddForSolid() 691 | elif self.API_type(obj_collection)=='ObjectCollection': 692 | profile=sketch.Profiles.AddForSolid(False, obj_collection) 693 | else: 694 | raise Exception('ERROR: Invalid object collection type, must be API type ObjectCollection') 695 | 696 | extrudeDef=self.compdef.Features.ExtrudeFeatures.CreateExtrudeDefinition(profile, op) 697 | extrudeDef.SetDistanceExtent(self.unit_conv(thickness), extrude_dir) 698 | return self.compdef.Features.ExtrudeFeatures.Add(extrudeDef) 699 | 700 | def revolve_full(self, sketch, axis='x', obj_collection=None, operation='join'): 701 | sketch_obj, sketch_num, _=self.sketch_test(sketch) 702 | sketch=sketch_obj 703 | if type(axis)==str: 704 | if axis=='x': 705 | axis=self.compdef.WorkAxes.Item(1) 706 | elif axis=='y': 707 | axis=self.compdef.WorkAxes.Item(2) 708 | elif axis=='z': 709 | axis=self.compdef.WorkAxes.Item(3) 710 | else: 711 | raise Exception("ERROR: Invalid axis, must be x, y, z") 712 | elif self.API_type(axis)=='SketchLine': 713 | pass 714 | else: 715 | raise Exception('ERROR: Revolve axis must be SketchLine object or cardinal axis') 716 | 717 | if operation=='join': 718 | op=constants.kJoinOperation 719 | elif operation=='intersect': 720 | op=constants.kIntersectOperation 721 | elif operation=='cut': 722 | op=constants.kCutOperation 723 | elif operation=='new_form': 724 | op=constants.kNewBodyOperation 725 | elif operation=='surface': 726 | op=constants.kSurfaceOperation 727 | else: 728 | raise Exception('ERROR: Operation must be either join, cut, intersect, new_form, or surface.') 729 | 730 | 731 | if obj_collection==None: 732 | profile=sketch.Profiles.AddForSolid() 733 | elif self.API_type(obj_collection)=='ObjectCollection': 734 | profile=sketch.Profiles.AddForSolid(False, obj_collection) 735 | 736 | revolveDef=self.compdef.Features.RevolveFeatures.AddFull(profile, axis, op) 737 | return revolveDef 738 | 739 | def revolve_ang(self, sketch, angle, axis='x', obj_collection=None, direction='positive', operation='join'): 740 | sketch_obj, sketch_num, _=self.sketch_test(sketch) 741 | sketch=sketch_obj 742 | if type(axis)==str: 743 | if axis=='x': 744 | axis=self.compdef.WorkAxes.Item(1) 745 | elif axis=='y': 746 | axis=self.compdef.WorkAxes.Item(2) 747 | elif axis=='z': 748 | axis=self.compdef.WorkAxes.Item(3) 749 | else: 750 | raise Exception("ERROR: Invalid axis, must be x, y, z") 751 | elif self.API_type(axis)=='SketchLine': 752 | pass 753 | else: 754 | raise Exception('ERROR: Revolve axis must be SketchLine object or cardinal axis') 755 | 756 | if operation=='join': 757 | op=constants.kJoinOperation 758 | elif operation=='intersect': 759 | op=constants.kIntersectOperation 760 | elif operation=='cut': 761 | op=constants.kCutOperation 762 | elif operation=='new_form': 763 | op=constants.kNewBodyOperation 764 | elif operation=='surface': 765 | op=constants.kSurfaceOperation 766 | else: 767 | raise Exception('ERROR: Operation must be either join, cut, intersect, new_form, or surface.') 768 | 769 | if direction=='positive': 770 | extrude_dir=constants.kPositiveExtentDirection 771 | elif direction=='negative': 772 | extrude_dir=constants.kNegativeExtentDirection 773 | elif direction=='symmetric': 774 | extrude_dir=constants.kSymmetricExtentDirection 775 | else: 776 | raise Exception('ERROR: Extrude direction must be positive, negative, or symmetric') 777 | 778 | if obj_collection==None: 779 | profile=sketch.Profiles.AddForSolid() 780 | elif self.API_type(obj_collection)=='ObjectCollection': 781 | profile=sketch.Profiles.AddForSolid(False, obj_collection) 782 | 783 | revolveDef=self.compdef.Features.RevolveFeatures.AddByAngle(profile, axis, self.ang_conv(angle), extrude_dir, op) 784 | return revolveDef 785 | 786 | def circular_feature_pattern(self, obj_collection, count, angle, axis='x', axis_dir=True, fit_within_ang=True): 787 | if type(axis)==str: 788 | if axis=='x': 789 | axis=self.compdef.WorkAxes.Item(1) 790 | elif axis=='y': 791 | axis=self.compdef.WorkAxes.Item(2) 792 | elif axis=='z': 793 | axis=self.compdef.WorkAxes.Item(3) 794 | else: 795 | raise Exception("ERROR: Invalid axis, must be x, y, z") 796 | elif self.API_type(axis)=='WorkAxis': 797 | pass 798 | elif self.API_type(axis)=='SketchLine': 799 | axis=self.work_axes_from_line(axis) 800 | else: 801 | raise Exception('ERROR: Revolve axis must be WorkAxis object or cardinal axis') 802 | 803 | if self.API_type(obj_collection)!='ObjectCollection': 804 | raise Exception('ERROR: obj_collection must be of object collection type (see new_obj_collection)') 805 | else: 806 | pass 807 | 808 | if self.units=='imperial': 809 | rot_angle='%.3f deg'%angle 810 | elif self.units=='radian': 811 | rot_angle='%.3f rad'%angle 812 | pat_def=self.compdef.Features.CircularPatternFeatures.CreateDefinition(obj_collection, axis, axis_dir, count, rot_angle, fit_within_ang) 813 | pat_feat=self.compdef.Features.CircularPatternFeatures.AddByDefinition(pat_def) 814 | pat_feat.SetEndOfPart(True) 815 | pat_feat.Parameters.Item(1).Expression=rot_angle 816 | pat_feat.SetEndOfPart(False) 817 | return pat_feat 818 | 819 | def rectangular_feature_pattern(self, obj_collection, count, spacing, axis='x', direction='positive', fit_within_len=False): 820 | if type(axis)==str: 821 | if axis=='x': 822 | axis=self.compdef.WorkAxes.Item(1) 823 | elif axis=='y': 824 | axis=self.compdef.WorkAxes.Item(2) 825 | elif axis=='z': 826 | axis=self.compdef.WorkAxes.Item(3) 827 | else: 828 | raise Exception("ERROR: Invalid axis, must be x, y, z") 829 | elif self.API_type(axis)=='WorkAxis': 830 | pass 831 | else: 832 | raise Exception('ERROR: Revolve axis must be WorkAxis object or cardinal axis') 833 | 834 | if self.API_type(obj_collection)!='ObjectCollection': 835 | raise Exception('ERROR: obj_collection must be of object collection type (see new_obj_collection)') 836 | else: 837 | pass 838 | 839 | if fit_within_len==False: 840 | space_type=constants.kDefault 841 | elif fit_within_len==True: 842 | space_type=constants.kFitted 843 | else: 844 | raise Exception('ERROR: fit within length must be boolean') 845 | 846 | if direction=='positive': 847 | direction=True 848 | elif direction=='negative': 849 | direction=False 850 | else: 851 | raise Exception('ERROR: direction must be positive of negative') 852 | 853 | pat_def=self.compdef.Features.RectangularPatternFeatures.CreateDefinition(obj_collection, axis, direction, int(count), self.unit_conv(spacing), space_type) 854 | pat_feat=self.compdef.Features.RectangularPatternFeatures.AddByDefinition(pat_def) 855 | return pat_feat 856 | 857 | def mirror_objects(self, obj_collection, mirror_plane='xy', compute_type='identical'): 858 | if type(mirror_plane)==str: 859 | if mirror_plane=='xy': 860 | mirror_plane='XY Plane' 861 | elif mirror_plane=='xz': 862 | mirror_plane='XZ Plane' 863 | elif mirror_plane=='yz': 864 | mirror_plane='YZ Plane' 865 | else: 866 | raise Exception('ERROR: Invalid plane desciptor, (xy, xz, yz)') 867 | mirror_plane=self.compdef.WorkPlanes.Item(mirror_plane) 868 | 869 | elif self.API_type(mirror_plane)=='planes': 870 | mirror_plane=mirror_plane.plane_obj 871 | pass 872 | elif self.API_type(mirror_plane)=='WorkPlane': 873 | pass 874 | else: 875 | raise TypeError('ERROR: Invalid plane desciptor, (xy, xz, yz) or Inventor plane object') 876 | 877 | if compute_type=='identical': 878 | comp_type=constants.kIdenticalCompute 879 | elif compute_type=='optimized': 880 | comp_type=constants.kOptimizedCompute 881 | elif compute_type=='adjusted': 882 | comp_type=constants.kAdjustToModelCompute 883 | else: 884 | raise Exception('Compute-type must be identical, optimized, or adjusted...may need to play around with.') 885 | 886 | if self.API_type(obj_collection)!='ObjectCollection': 887 | raise TypeError('ERROR: obj_collection must be of object collection type (see new_obj_collection)') 888 | else: 889 | pass 890 | mirror_def=self.compdef.Features.MirrorFeatures.CreateDefinition(obj_collection, mirror_plane, 47361) 891 | return self.compdef.Features.MirrorFeatures.AddByDefinition(mirror_def) 892 | 893 | def fixed_work_point(self, sketch, pos, construction=True): 894 | return self.compdef.WorkPoints.AddByPoint(self.sketch_point(sketch, pos), construction) 895 | 896 | def center_arc_line(self, sketch, center, radius, start_ang, sweep_ang): 897 | sketch_obj, _, _=self.sketch_test(sketch) 898 | center_pt=self.point(center) 899 | radius=self.unit_conv(radius) 900 | start_ang=self.ang_conv(start_ang) 901 | sweep_ang=self.ang_conv(sweep_ang) 902 | arc_lines=sketch_obj.SketchArcs 903 | return arc_lines.AddByCenterStartSweepAngle(center_pt, radius, start_ang, sweep_ang) 904 | 905 | def work_axes_2_pt(self, sketch, start_pt, end_pt): 906 | return self.compdef.WorkAxes.AddByTwoPoints(self.sketch_point(sketch, start_pt), self.sketch_point(sketch, end_pt)) 907 | 908 | def work_axes_from_line(self, line): 909 | if self.API_type(line)!='SketchLine': 910 | raise TypeError('Line must be SketchLine object') 911 | return self.compdef.WorkAxes.AddByLine(line) 912 | 913 | 914 | def arc_line(self, sketch, center, start_pt, end_pt, flip=True): 915 | sketch_obj, _, _=self.sketch_test(sketch) 916 | center_pt=self.point(center) 917 | start_pt=self.point(start_pt) 918 | end_pt=self.point(end_pt) 919 | arc_lines=sketch_obj.SketchArcs 920 | return arc_lines.AddByCenterStartEndPoint(center_pt, start_pt, end_pt, flip) 921 | 922 | def new_hole(self,sketch, pos, dia, depth, direction='negative', FlatBottom=False, BottomTipAngle=None): 923 | sketch_obj, sketch_num, plane=self.sketch_test(sketch) 924 | dia=self.unit_conv(dia) 925 | depth=self.unit_conv(depth) 926 | self.hole_num+=1 927 | self.hole_list.append(self.hole_num) 928 | 929 | if direction=='positive': 930 | extent_dir=constants.kPositiveExtentDirection 931 | elif direction=='negative': 932 | extent_dir=constants.kNegativeExtentDirection 933 | elif direction=='symmetric': 934 | extent_dir=constants.kSymmetricExtentDirection 935 | else: 936 | raise Exception('ERROR: Extrude direction must be positive, negative, or symmetric') 937 | 938 | if type(pos)==tuple: 939 | work_point=self.fixed_work_point(sketch, pos) 940 | hole_placement=self.compdef.Features.HoleFeatures.CreatePointPlacementDefinition(work_point, plane.plane_obj) 941 | elif type(pos)==list and pos!=[]: 942 | points_coll=self.sketch_point_coll(sketch, pos) 943 | hole_placement=self.compdef.Features.HoleFeatures.CreateSketchPlacementDefinition(points_coll) 944 | 945 | hole_feature=self.compdef.Features.HoleFeatures.AddDrilledByDistanceExtent(hole_placement, dia, depth, extent_dir, FlatBottom, BottomTipAngle) 946 | return hole_feature 947 | 948 | def new_threaded_hole(self, sketch, pos, depth, thread_dia, thread_pitch, thread_depth, direction='negative', right_handed=True, FlatBottom=False, BottomTipAngle=None): 949 | sketch_obj, sketch_num, plane=self.sketch_test(sketch) 950 | depth=self.unit_conv(depth) 951 | thread_depth=self.unit_conv(thread_depth) 952 | self.hole_num+=1 953 | self.hole_list.append(self.hole_num) 954 | 955 | if direction=='positive': 956 | extent_dir=constants.kPositiveExtentDirection 957 | elif direction=='negative': 958 | extent_dir=constants.kNegativeExtentDirection 959 | elif direction=='symmetric': 960 | extent_dir=constants.kSymmetricExtentDirection 961 | else: 962 | raise Exception('ERROR: Extrude direction must be positive, negative, or symmetric') 963 | 964 | if thread_dia[0].upper()=='M': 965 | thread_type='metric' 966 | thread_dia=thread_dia[1::] 967 | else: 968 | thread_type='unified' 969 | 970 | if thread_depth>=depth: 971 | full_tap_depth=True 972 | thread_depth=depth 973 | else: 974 | full_tap_depth=False 975 | 976 | thread_type, thread_dsig, thread_class=self.thread_gen(dia=thread_dia, pitch=thread_pitch, thread_type=thread_type, thread_class='') 977 | 978 | hole_tap_info=self.compdef.Features.HoleFeatures.CreateTapInfo(right_handed, thread_dsig, thread_type, thread_class, full_tap_depth, thread_depth) 979 | 980 | if type(pos)==tuple: 981 | work_point=self.fixed_work_point(sketch, pos) 982 | hole_placement=self.compdef.Features.HoleFeatures.CreatePointPlacementDefinition(work_point, plane.plane_obj) 983 | elif type(pos)==list and pos!=[]: 984 | points_coll=self.sketch_point_coll(sketch, pos) 985 | hole_placement=self.compdef.Features.HoleFeatures.CreateSketchPlacementDefinition(points_coll) 986 | 987 | hole_feature=self.compdef.Features.HoleFeatures.AddDrilledByDistanceExtent(hole_placement, hole_tap_info, depth, extent_dir, FlatBottom, BottomTipAngle) 988 | return hole_feature 989 | 990 | def sketch_spline(self, sketch, points): 991 | sketch=sketch.sketch_obj 992 | pt_coll=self.new_obj_collection() 993 | pts=[self.point(pt) for pt in points] 994 | for pt in pts: 995 | pt_coll.Add(pt) 996 | spline=sketch.SketchSplines.Add(pt_coll) 997 | return spline 998 | 999 | def sketch_line(self, sketch, start, end): 1000 | sketch_obj, _, _=self.sketch_test(sketch) 1001 | lines=sketch_obj.SketchLines 1002 | return lines.AddByTwoPoints(self.point(start), self.point(end)) 1003 | 1004 | def poly_lines(self, sketch, points): 1005 | sketch_obj, _, _=self.sketch_test(sketch) 1006 | points=self.unit_conv(points) 1007 | if len(points)<3: 1008 | raise Exception('ERROR: Points array must be len=3 or greater') 1009 | else: 1010 | pass 1011 | 1012 | if points[0]!=points[-1]: 1013 | points.append(points[0]) 1014 | 1015 | start=points[0] 1016 | start_pt=self.tg.CreatePoint2d(start[0], start[1]) 1017 | lines=[] 1018 | self.tg=self.invApp.TransientGeometry 1019 | line_obj=sketch_obj.SketchLines 1020 | for pt in points[1:-1]: 1021 | stop_pt=self.tg.CreatePoint2d(pt[0], pt[1]) 1022 | lines.append(line_obj.AddByTwoPoints(start_pt, stop_pt)) 1023 | start_pt=lines[-1].EndSketchPoint 1024 | 1025 | lines.append(line_obj.AddByTwoPoints(start_pt, lines[0].StartSketchPoint)) 1026 | 1027 | poly_line_coll=self.new_obj_collection() 1028 | for vals in lines: 1029 | poly_line_coll.Add(vals) 1030 | 1031 | return poly_line_coll 1032 | 1033 | def new_obj_collection(self): 1034 | trans_obj=self.invApp.TransientObjects 1035 | return trans_obj.CreateObjectCollection() 1036 | 1037 | def create_obj_collection(self, obj): 1038 | new_coll=self.new_obj_collection() 1039 | if type(obj)==list: 1040 | for objs in obj: 1041 | obj_check=self.object_check(objs) 1042 | if obj_check!='Inventor Object': 1043 | if obj_check!='ObjectCollection': 1044 | raise Exception('ERROR: object not Inventor Object or Object Collection') 1045 | else: 1046 | pass 1047 | else: 1048 | if obj_check!='ObjectCollection': 1049 | new_coll.Add(objs) 1050 | else: 1051 | pass 1052 | else: 1053 | obj_check=self.object_check(obj) 1054 | if obj_check!='Inventor Object': 1055 | if obj_check!='ObjectCollection': 1056 | raise Exception('ERROR: object not Inventor Object or Object Collection') 1057 | else: 1058 | pass 1059 | else: 1060 | if obj_check!='ObjectCollection': 1061 | new_coll.Add(obj) 1062 | else: 1063 | pass 1064 | return new_coll 1065 | 1066 | def draw_line_arc(self, sketch, obj_dict, item): 1067 | if type(item)==int: 1068 | obj_key='obj_%s'%str(item) 1069 | elif type(item)==str: 1070 | obj_key=item 1071 | 1072 | if obj_key in obj_dict.keys(): 1073 | if obj_dict[obj_key]['type']=='line_arc': 1074 | pass 1075 | else: 1076 | raise Exception('ERROR: Invalid line arc object for obj ID') 1077 | else: 1078 | raise Exception('ERROR: Obj ID not valid for structure') 1079 | 1080 | obj=obj_dict[obj_key] 1081 | arc=self.arc_line(sketch, center=obj['center_pt'], start_pt=obj['start_pt'], end_pt=obj['end_pt']) 1082 | return arc 1083 | 1084 | def draw_line(self, sketch, obj_dict, item): 1085 | if type(item)==int: 1086 | obj_key='obj_%s'%str(item) 1087 | elif type(item)==str: 1088 | obj_key=item 1089 | 1090 | if obj_key in obj_dict.keys(): 1091 | if obj_dict[obj_key]['type']=='line': 1092 | pass 1093 | else: 1094 | raise Exception('ERROR: Invalid line arc object for obj ID') 1095 | else: 1096 | raise Exception('ERROR: Obj ID not valid for structure') 1097 | 1098 | obj=obj_dict[obj_key] 1099 | line=self.sketch_line(sketch, start=obj['start_pt'], end=obj['end_pt']) 1100 | return line 1101 | 1102 | 1103 | class structure(object): 1104 | def __init__(self, part, sketch, start=(0.0,0.0), direction=0): 1105 | 1106 | part_type=self.obj_type_check(part) 1107 | sketch_type=self.obj_type_check(sketch) 1108 | 1109 | if sketch_type!='sketch': 1110 | raise Exception('ERROR: Invalid sketch type=%s. Input sketch of wrong type, must be sketch type'%(sketch_type)) 1111 | else: 1112 | pass 1113 | 1114 | if part_type!='iPart': 1115 | raise Exception('ERROR: Invalid part type=%s. Input part of wrong type, must be iPart type'%(sketch_type)) 1116 | else: 1117 | pass 1118 | 1119 | self.start=start 1120 | self.last=start 1121 | self.last_dir=direction 1122 | self.sketch=sketch 1123 | self.part=part 1124 | self.obj_dict={'start':{'type':'origin', 'pts':[start]}} 1125 | self.obj_num=0 1126 | 1127 | def obj_type_check(self, obj): 1128 | return str(type(obj)).split(' ')[-1].split('.')[-1].split('\'')[0] 1129 | 1130 | def move(self, distance, direction=None): 1131 | if direction == None: direction = self.last_dir 1132 | self.last = translate_pt(self.last, ang2pt(direction, distance)) 1133 | 1134 | def append_element(self, obj_handle): 1135 | self.obj_num+=1 1136 | self.obj_dict['obj_%s'%str(self.obj_num)]=obj_handle 1137 | 1138 | def get_pts(self): 1139 | pts=[self.obj_dict['start']['pts'][0]] 1140 | obj_keys=[] 1141 | for key in iter(self.obj_dict.keys()): 1142 | if "point" in self.obj_dict[key]['type']: 1143 | pts+=self.obj_dict[key]['pts'] 1144 | obj_keys.append(key) 1145 | pts=remove_duplicate_pts(pts) 1146 | return [pts, obj_keys] 1147 | 1148 | def get_line_pts(self): 1149 | pts=[] 1150 | obj_keys=[] 1151 | for key in iter(self.obj_dict.keys()): 1152 | if "line" in self.obj_dict[key]['type']: 1153 | if "point" in self.obj_dict[key]['type']: 1154 | pass 1155 | else: 1156 | for sub_key in iter(self.obj_dict[key]): 1157 | if "_pt" in sub_key: 1158 | pts.append(self.obj_dict[key][sub_key]) 1159 | obj_keys.append(key) 1160 | pts.append(pts[0]) 1161 | return [pts, obj_keys] 1162 | 1163 | def get_poly_pts(self): 1164 | pts=[] 1165 | obj_keys=[] 1166 | for key in iter(self.obj_dict.keys()): 1167 | if "poly" in self.obj_dict[key]['type']: 1168 | pts+=self.obj_dict[key]['pts'] 1169 | obj_keys.append(key) 1170 | return [pts, obj_keys] 1171 | 1172 | def draw_poly(self, item=1): 1173 | sketch=self.sketch 1174 | obj_dict=self.obj_dict 1175 | if type(item)==int: 1176 | obj_key='obj_%s'%str(item) 1177 | elif type(item)==str: 1178 | obj_key=item 1179 | 1180 | try: 1181 | if 'poly' in obj_dict[obj_key]['type']: 1182 | pass 1183 | else: 1184 | raise Exception('ERROR: Invalid structure type, must be polygon') 1185 | except: 1186 | raise Exception('ERROR: Poly object does not exist, check item number') 1187 | 1188 | pts=obj_dict[obj_key]['pts'] 1189 | 1190 | self.poly_line_coll=self.part.poly_lines(sketch, pts) 1191 | return self.poly_line_coll 1192 | 1193 | 1194 | def draw_path(self, item='all', close_path=False): 1195 | sketch=self.sketch 1196 | obj_dict=self.obj_dict 1197 | if len(list(obj_dict.keys()))<2: 1198 | raise Exception('ERROR: Object list is empty') 1199 | else: 1200 | pass 1201 | if type(item)==int: 1202 | obj_keys=['obj_%s'%str(item)] 1203 | elif type(item)==str: 1204 | if item=='all': 1205 | obj_keys=[] 1206 | for key in iter(obj_dict.keys()): 1207 | if key=='start': 1208 | pass 1209 | else: 1210 | obj_keys.append(key) 1211 | elif item.split('_')[0]=='obj': 1212 | obj_keys=[item] 1213 | else: 1214 | raise Exception('ERROR: Invalid object key, must be all, or object identifier string') 1215 | elif type(item)==list: 1216 | if type(item[0])==str: 1217 | obj_keys=[] 1218 | for keys in item: 1219 | if keys in obj_dict.keys(): 1220 | obj_keys.append() 1221 | else: 1222 | raise Exception('ERROR: Invalid structure key') 1223 | else: 1224 | raise Exception('ERROR: Invalid structure key identifier, must be of form obj_(int value)') 1225 | else: 1226 | raise Exception('ERROR: Invalid object identifer input, must be all, string of obj ID, or list of obj ID') 1227 | 1228 | if obj_keys[0]!='line': 1229 | start_pt=obj_dict['start']['pts'][0] 1230 | else: 1231 | start_pt=obj_dict[obj_keys[0]]['start_pt'] 1232 | 1233 | lines=[] 1234 | 1235 | final_pt=obj_dict[obj_keys[-1]]['end_pt'] 1236 | 1237 | first_pt=start_pt 1238 | 1239 | for key in obj_keys: 1240 | s_copy=copy.deepcopy(obj_dict) 1241 | s_copy[key]['start_pt']=start_pt 1242 | if obj_dict[key]['type']=='line_arc': 1243 | lines.append(self.draw_line_arc(s_copy, key)) 1244 | elif obj_dict[key]['type']=='line': 1245 | lines.append(self.draw_line(s_copy, key)) 1246 | elif obj_dict[key]['type']=='spline': 1247 | lines.append(self.draw_spline(s_copy, key)) 1248 | if len(lines)>1: 1249 | lines[-1].StartSketchPoint.Merge(lines[-2].EndSketchPoint) 1250 | 1251 | end_pt_coord=round_pt(self.part.inv_unit_conv((lines[-1].EndSketchPoint.Geometry.X, lines[-1].EndSketchPoint.Geometry.Y))) 1252 | 1253 | if type(start_pt)==tuple: 1254 | start_pt_check=round_pt(start_pt) 1255 | else: 1256 | start_pt_check=round_pt(self.part.inv_unit_conv((start_pt.Geometry.X, start_pt.Geometry.Y))) 1257 | 1258 | if end_pt_coord==start_pt_check: 1259 | start_pt=lines[-1].StartSketchPoint 1260 | else: 1261 | start_pt=lines[-1].EndSketchPoint 1262 | 1263 | if close_path==True and first_pt!=final_pt: 1264 | line_obj=sketch.sketch_obj.SketchLines 1265 | lines.append(line_obj.AddByTwoPoints(start_pt, lines[0].StartSketchPoint)) 1266 | elif close_path==True and first_pt==final_pt: 1267 | start_pt.Merge(lines[0].StartSketchPoint) 1268 | else: 1269 | pass 1270 | 1271 | obj_coll=self.part.new_obj_collection() 1272 | for vals in lines: 1273 | obj_coll.Add(vals) 1274 | 1275 | return obj_coll 1276 | 1277 | def get_plt_pts(self, item='all', close_path=False, curve_res=10): 1278 | obj_dict=self.obj_dict 1279 | if len(list(obj_dict.keys()))<2: 1280 | raise Exception('ERROR: Object list is empty') 1281 | else: 1282 | pass 1283 | if type(item)==int: 1284 | obj_keys=['obj_%s'%str(item)] 1285 | elif type(item)==str: 1286 | if item=='all': 1287 | obj_keys=[] 1288 | for key in iter(obj_dict.keys()): 1289 | if key=='start': 1290 | pass 1291 | else: 1292 | obj_keys.append(key) 1293 | elif item.split('_')[0]=='obj': 1294 | obj_keys=[item] 1295 | else: 1296 | raise Exception('ERROR: Invalid object key, must be all, or object identifier string') 1297 | elif type(item)==list: 1298 | if type(item[0])==str: 1299 | obj_keys=[] 1300 | for keys in item: 1301 | if keys in obj_dict.keys(): 1302 | obj_keys.append() 1303 | else: 1304 | raise Exception('ERROR: Invalid structure key') 1305 | else: 1306 | raise Exception('ERROR: Invalid structure key identifier, must be of form obj_(int value)') 1307 | else: 1308 | raise Exception('ERROR: Invalid object identifer input, must be all, string of obj ID, or list of obj ID') 1309 | 1310 | if obj_keys[0]!='line': 1311 | start_pt=obj_dict['start']['pts'][0] 1312 | else: 1313 | start_pt=obj_dict[obj_keys[0]]['start_pt'] 1314 | 1315 | pts=[] 1316 | 1317 | for key in obj_keys: 1318 | s_copy=copy.deepcopy(obj_dict) 1319 | s_copy[key]['start_pt']=start_pt 1320 | if obj_dict[key]['type']=='line_arc': 1321 | start=obj_dict[key]['start_pt'] 1322 | end=obj_dict[key]['end_pt'] 1323 | center=obj_dict[key]['center_pt'] 1324 | arc_pts=arc_pts_pattern(start, end, center, curve_res) 1325 | for pt in arc_pts: 1326 | pts.append(pt) 1327 | elif obj_dict[key]['type']=='line': 1328 | line_pts=[obj_dict[key]['start_pt'], obj_dict[key]['end_pt']] 1329 | for pt in line_pts: 1330 | pts.append(pt) 1331 | elif obj_dict[key]['type']=='spline': 1332 | for pt in obj_dict[key]['pts']: 1333 | pts.append(pt) 1334 | return pts 1335 | 1336 | 1337 | def draw_line_arc(self, obj_dict, item): 1338 | sketch=self.sketch 1339 | 1340 | if type(item)==int: 1341 | obj_key='obj_%s'%str(item) 1342 | elif type(item)==str: 1343 | obj_key=item 1344 | 1345 | if obj_key in obj_dict.keys(): 1346 | if obj_dict[obj_key]['type']=='line_arc': 1347 | pass 1348 | else: 1349 | raise Exception('ERROR: Invalid line arc object for obj ID') 1350 | else: 1351 | raise Exception('ERROR: Obj ID not valid for structure') 1352 | 1353 | obj=obj_dict[obj_key] 1354 | arc=self.part.arc_line(sketch, center=obj['center_pt'], start_pt=obj['start_pt'], end_pt=obj['end_pt'], flip=obj['flip']) 1355 | return arc 1356 | 1357 | def draw_line(self, obj_dict, item): 1358 | sketch=self.sketch 1359 | if type(item)==int: 1360 | obj_key='obj_%s'%str(item) 1361 | elif type(item)==str: 1362 | obj_key=item 1363 | 1364 | if obj_key in obj_dict.keys(): 1365 | if obj_dict[obj_key]['type']=='line': 1366 | pass 1367 | else: 1368 | raise Exception('ERROR: Invalid line arc object for obj ID') 1369 | else: 1370 | raise Exception('ERROR: Obj ID not valid for structure') 1371 | 1372 | obj=obj_dict[obj_key] 1373 | line=self.part.sketch_line(sketch, start=obj['start_pt'], end=obj['end_pt']) 1374 | return line 1375 | 1376 | def draw_spline(self, obj_dict, item): 1377 | sketch=self.sketch 1378 | if type(item)==int: 1379 | obj_key='obj_%s'%str(item) 1380 | elif type(item)==str: 1381 | obj_key=item 1382 | 1383 | if obj_key in obj_dict.keys(): 1384 | if obj_dict[obj_key]['type']=='spline': 1385 | pass 1386 | else: 1387 | raise Exception('ERROR: Invalid line arc object for obj ID') 1388 | else: 1389 | raise Exception('ERROR: Obj ID not valid for structure') 1390 | 1391 | obj=obj_dict[obj_key] 1392 | spline=self.part.sketch_spline(sketch, obj['pts']) 1393 | return spline 1394 | 1395 | def add_bspline(self, num_pts, control_pts, degree=3, flip_dir=False, rotation=None, mirror=False, mirror_angle=0): 1396 | points=b_spline(control_pts, num=num_pts, degree=degree) 1397 | if flip_dir==True: 1398 | points=points[::-1] 1399 | if rotation!=None: 1400 | points=rotate_pts(points, angle=rotation, center=points[0]) 1401 | if mirror==True: 1402 | points=mirror_pts(points, axis_angle=mirror_angle, axis_pt=points[0]) 1403 | dx=self.last[0]-points[0][0] 1404 | dy=self.last[1]-points[0][1] 1405 | new_pts=translate_pts(points, (dx, dy)) 1406 | spline_obj={'type':'spline','pts':new_pts, 'start_pt':new_pts[0], 'end_pt':new_pts[-1]} 1407 | self.last=new_pts[-1] 1408 | self.append_element(spline_obj) 1409 | self.structure_key=list(self.obj_dict.keys())[-1] 1410 | 1411 | def add_point_arc(self, start_angle=0, stop_angle=180, radius=1, segments=9, flip_dir=False, mirror=False, rotation=0): 1412 | start=round_pt(self.last) 1413 | init_angle=0 1414 | sweep_angle=stop_angle-start_angle 1415 | if sweep_angle<0: 1416 | sweep_dir=1 1417 | else: 1418 | sweep_dir=-1 1419 | if flip_dir==False: 1420 | flip=1.0 1421 | else: 1422 | flip=-1.0 1423 | center_dir=self.last_dir+sweep_dir*flip*90+rotation 1424 | center_pt=round_pt(translate_pt(start, ang2pt(center_dir, radius))) 1425 | start_angle=init_angle+start_angle+rotation 1426 | stop_angle=init_angle+stop_angle+rotation 1427 | pts=arc_pattern(start_angle, stop_angle, radius, center_pt, segments) 1428 | if mirror==False: 1429 | pass 1430 | else: 1431 | pts=mirror_pts(pts, rotation-90, center_pt) 1432 | pts=round_pts(pts) 1433 | self.last=pts[-1] 1434 | self.last_dir=stop_angle 1435 | point_obj={'type':'point_arc', 'pts':round_pts(pts)} 1436 | self.append_element(point_obj) 1437 | self.structure_key=list(self.obj_dict.keys())[-1] 1438 | self.pts=round_pts(pts) 1439 | 1440 | def add_line(self, distance, direction): 1441 | self.pts=[round_pt(self.last)] 1442 | end_pt=round_pt(translate_pt(self.pts[-1], ang2pt(direction, distance))) 1443 | self.pts.append(end_pt) 1444 | self.last=end_pt 1445 | self.last_dir=direction 1446 | line_obj={'type':'line', 'start_pt':self.pts[0], 'end_pt':self.pts[1]} 1447 | self.append_element(line_obj) 1448 | self.structure_key=list(self.obj_dict.keys())[-1] 1449 | 1450 | def add_point_line(self, distance, direction, num_points): 1451 | start=self.last 1452 | disp=float(distance)/(num_points-1) 1453 | pts=[start] 1454 | for i in range(num_points-1): 1455 | pts.append(round_pt(translate_pt(pts[-1], ang2pt(direction, disp)))) 1456 | self.last=pts[-1] 1457 | self.last_dir=direction 1458 | point_obj={'type':'point_line', 'pts':pts } 1459 | self.append_element(point_obj) 1460 | self.structure_key=list(self.obj_dict.keys())[-1] 1461 | self.pts=pts 1462 | 1463 | def add_line_arc(self, start_angle=0, stop_angle=180, radius=1, flip_dir=False, mirror=False, rotation=0): 1464 | start=round_pt(self.last) 1465 | center_dir=self.last_dir+rotation+90 1466 | center_pt=round_pt(translate_pt(start, ang2pt(center_dir, radius))) 1467 | start_angle=start_angle+rotation 1468 | stop_angle=stop_angle+rotation 1469 | sweep_angle=stop_angle-start_angle 1470 | pts=arc_pattern(start_angle, stop_angle, radius, center_pt, segments=2) 1471 | if mirror==False: 1472 | pass 1473 | else: 1474 | pts=mirror_pts(pts, rotation-90, center_pt) 1475 | pts=round_pts(pts) 1476 | self.last=pts[-1] 1477 | self.last_dir=stop_angle 1478 | line_obj={'type':'line_arc', 'center_pt':center_pt, 'start_pt': start, 'end_pt':self.last, 'flip':flip_dir} 1479 | self.append_element(line_obj) 1480 | self.structure_key=list(self.obj_dict.keys())[-1] 1481 | 1482 | def add_point(self, offset, ref_pt=None): 1483 | if ref_pt==None: 1484 | ref_pt=round_pt(self.last) 1485 | else: 1486 | if type(ref_pt)==tuple: 1487 | if len(ref_pt)==2: 1488 | pass 1489 | else: 1490 | raise Exception("ERROR: Ref point muts be tuple of len=2") 1491 | else: 1492 | raise Exception("ERROR: Ref point must be tuple of len=2") 1493 | end_pt=round_pt(translate_pt(ref_pt, offset)) 1494 | self.last=end_pt 1495 | point_obj={'type':'point', 'pts':[end_pt]} 1496 | self.append_element(point_obj) 1497 | self.structure_key=list(self.obj_dict.keys())[-1] 1498 | self.pts=round_pt(end_pt) 1499 | 1500 | 1501 | 1502 | def get_next_filename(datapath,prefix,suffix=''): 1503 | ii = next_file_index(datapath, prefix) 1504 | return "%05d_" % (ii) + prefix +suffix 1505 | 1506 | def next_file_index(datapath,prefix=''): 1507 | """Searches directories for files of the form *_prefix* and returns next number 1508 | in the series""" 1509 | 1510 | dirlist=glob.glob(os.path.join(datapath,'*_'+prefix+'*')) 1511 | dirlist.sort() 1512 | try: 1513 | ii=int(os.path.split(dirlist[-1])[-1].split('_')[0])+1 1514 | except: 1515 | ii=0 1516 | return ii 1517 | 1518 | def round_pt(pt, digits=5): 1519 | return (round(pt[0], digits), round(pt[1], digits)) 1520 | 1521 | def round_pts(pts, digits=5): 1522 | return [(round(pt[0], digits), round(pt[1], digits)) for pt in pts] 1523 | 1524 | 1525 | def remove_duplicate_pts(seq): 1526 | seen = set() 1527 | seen_add = seen.add 1528 | return [x for x in seq if not (x in seen or seen_add(x))] 1529 | 1530 | def distance(tuple1, tuple2): 1531 | dx = tuple1[0] - tuple2[0] 1532 | dy = tuple1[1] - tuple2[1] 1533 | return sqrt(dx ** 2 + dy ** 2) 1534 | 1535 | 1536 | def ang2pt(direction, distance): 1537 | theta = np.pi * direction / 180 1538 | dx = distance * cos(theta) 1539 | dy = distance * sin(theta) 1540 | return (dx, dy) 1541 | 1542 | 1543 | def vec_rot(vector, angle): 1544 | rot_matrix=np.array([[np.cos(angle),-np.sin(angle)],[np.sin(angle),np.cos(angle)]]) 1545 | return np.dot(rot_matrix, vector) 1546 | 1547 | def arc_pts_pattern(start, end, center, num_pts, return_list=True, dir=None): 1548 | P_1=center 1549 | P_2=start 1550 | P_3=end 1551 | D_12=distance(P_1, P_2) 1552 | D_13=distance(P_1, P_3) 1553 | D_23=distance(P_2, P_3) 1554 | ang=np.arccos((D_12**2+D_13**2-D_23**2)/(2*D_12*D_13)) 1555 | ang_trans=ang/(num_pts-1) 1556 | start_dir=np.array([(P_2[0]-P_1[0])/D_12, (P_2[1]-P_1[1])/D_12]) 1557 | end_dir=np.array([(P_3[0]-P_1[0])/D_13, (P_3[1]-P_1[1])/D_13]) 1558 | dir_check=np.sign(np.cross(start_dir, end_dir)) 1559 | if dir_check==0 and type(dir)!=type(None): 1560 | dir=dir 1561 | elif dir_check==0 and type(dir)==type(None): 1562 | dir=1 1563 | else: 1564 | dir=dir_check 1565 | pts=[] 1566 | new_ang=0 1567 | for i in range(num_pts): 1568 | new_vec=D_12*vec_rot(start_dir, dir*new_ang) 1569 | pts.append((center[0]+new_vec[0], center[1]+new_vec[1])) 1570 | new_ang+=ang_trans 1571 | if return_list==False: 1572 | return np.transpose(np.array(pts)) 1573 | else: 1574 | return pts 1575 | def mirror_x(pts, xline, concatenate=True): 1576 | if concatenate==True: 1577 | pts_x=np.concatenate((pts[0], xline-pts[0][::-1])) 1578 | pts_y=np.concatenate((pts[1], pts[1][::-1])) 1579 | return np.array([pts_x, pts_y]) 1580 | else: 1581 | return np.array([xline-pts[0], pts[1]]) 1582 | 1583 | def rotate_pt(p, angle, center=(0, 0)): 1584 | """rotates point p=(x,y) about point center (defaults to (0,0)) by CCW angle (in degrees)""" 1585 | dx = p[0] - center[0] 1586 | dy = p[1] - center[1] 1587 | theta = np.pi * angle / 180. 1588 | return (center[0] + dx * cos(theta) - dy * sin(theta), center[1] + dx * sin(theta) + dy * cos(theta)) 1589 | 1590 | 1591 | def rotate_pts(points, angle, center=(0, 0)): 1592 | """Rotates an array of points one by one using rotate_pt""" 1593 | return [rotate_pt(p, angle, center) for p in points] 1594 | 1595 | 1596 | def translate_pt(p, offset): 1597 | """Translates point p=(x,y) by offset=(x,y)""" 1598 | return (p[0] + offset[0], p[1] + offset[1]) 1599 | 1600 | 1601 | def translate_pts(points, offset): 1602 | """Translates an array of points one by one using translate_pt""" 1603 | return [translate_pt(p, offset) for p in points] 1604 | 1605 | 1606 | def orient_pt(p, angle, offset): 1607 | """Orient_pt rotates point p=(x,y) by angle (in degrees) and then translates it to offset=(x,y)""" 1608 | return translate_pt(rotate_pt(p, angle), offset) 1609 | 1610 | 1611 | def orient_pts(points, angle, offset): 1612 | """Orients an array of points one by one using orient_pt""" 1613 | return [orient_pt(p, angle, offset) for p in points] 1614 | 1615 | 1616 | def scale_pt(p, scale): 1617 | """Scales p=(x,y) by scale""" 1618 | return (p[0] * scale[0], p[1] * scale[1]) 1619 | 1620 | 1621 | def scale_pts(points, scale): 1622 | """Scales an array of points one by one using scale_pt""" 1623 | return [scale_pt(p, scale) for p in points] 1624 | 1625 | 1626 | def mirror_pt(p, axis_angle, axis_pt): 1627 | """Mirrors point p about a line at angle "axis_angle" intercepting point "axis_pt" """ 1628 | theta = axis_angle * np.pi / 180. 1629 | return (axis_pt[0] + (-axis_pt[0] + p[0]) * cos(2 * theta) + (-axis_pt[1] + p[1]) * sin(2 * theta), 1630 | p[1] + 2 * (axis_pt[1] - p[1]) * cos(theta) ** 2 + (-axis_pt[0] + p[0]) * sin(2 * theta) ) 1631 | 1632 | 1633 | def mirror_pts(points, axis_angle, axis_pt): 1634 | """Mirrors an array of points one by one using mirror_pt""" 1635 | return [mirror_pt(p, axis_angle, axis_pt) for p in points] 1636 | 1637 | def arc_pattern(start_angle, stop_angle, radius, center_pt=(2,1), segments=9): 1638 | if type(center_pt)==tuple or type(center_pt)==list: 1639 | if len(center_pt)==2: 1640 | pass 1641 | else: 1642 | raise Exception('ERROR: Center_pt must be list of len=2 of form [x,y]') 1643 | else: 1644 | raise Exception('ERROR: Invalid type, centerpoint must be list len=2 of form [x,y]') 1645 | pts = [] 1646 | x_0=center_pt[0] 1647 | y_0=center_pt[1] 1648 | for ii in range(segments): 1649 | theta = (start_angle + ii / (segments - 1.) * (stop_angle - start_angle)) * pi / 180. 1650 | p = (x_0+radius * cos(theta), y_0+radius * sin(theta)) 1651 | pts.append(p) 1652 | return pts 1653 | 1654 | 1655 | def circle_pattern(radius, center_pt=(0,0), segments=3, offset=0): 1656 | if type(center_pt)==tuple or type(center_pt)==list: 1657 | if len(center_pt)==2: 1658 | pass 1659 | else: 1660 | raise Exception('ERROR: Center_pt must be list of len=2 of form [x,y]') 1661 | else: 1662 | raise Exception('ERROR: Invalid type, centerpoint must be list len=2 of form [x,y]') 1663 | pts = [] 1664 | x_0=center_pt[0] 1665 | y_0=center_pt[1] 1666 | rot_ang=360/segments 1667 | theta=offset*np.pi/180 1668 | for ii in range(segments): 1669 | p = (x_0+radius * cos(theta), y_0+radius * sin(theta)) 1670 | theta += rot_ang * pi / 180. 1671 | pts.append(p) 1672 | return pts 1673 | 1674 | def bernstein_poly(order, k): 1675 | """ 1676 | Bernstein polynomial. 1677 | 1678 | """ 1679 | coeff = binom(order, k) 1680 | def _bpoly(x): 1681 | return coeff * x ** k * (1 - x) ** (order - k) 1682 | 1683 | return _bpoly 1684 | 1685 | 1686 | def b_spline(c_points, num=200, degree=3): 1687 | """ 1688 | Build Bézier curve from control points. 1689 | 1690 | """ 1691 | N = len(c_points) 1692 | # Prevent degree from exceeding count-1, otherwise splev will crash 1693 | degree = np.clip(degree,1,N-1) 1694 | 1695 | t = np.linspace(0, 1, num=num) 1696 | curve = np.zeros((num, 2)) 1697 | for ii in range(N): 1698 | curve += np.outer(bernstein_poly(degree , ii)(t), c_points[ii]) 1699 | return [tuple(pt) for pt in curve] 1700 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyInventor 2 | A Python based Autodesk Inventor API module! 3 | 4 | Welcome to PyInventor! The following is a module that allows for the creation of parts using Autodesk Inventor. I wrote this with the intent of automating the frustratingly slow process of 5 | parametrically varying features in inventor either by hand or using the tedius parameter editor or the built in VBA editor (iLogic). The pyinvent library is a wrapper for the Autodesk 6 | Inventor API library which is natively written in VBA (Visual Basic for Applications). Because of this both Autodesk Inventor and this library only work in Microsoft Windows. MacOS is 7 | completely incompatible (unless running Windows in bootcamp). 8 | 9 | This package does not require the Schuster Lab Library (slab) to run and can be used with any normal Anaconda 3.2 install or higher with no additional packages. Of course Autodesk Inventor is required. 10 | It is recommended that Inventor 2019 is used for best compatibility however this will run using Inventor 2017 or later (in theory), however the older variants have not been tested in depth. Anything 11 | after Inventor 2019 will also be compatible. For more information on this compatibility and to learn more about the Inventor API and its functionality please refer to the API manual: 12 | 13 | http://help.autodesk.com/view/INVNTOR/2019/ENU/ 14 | 15 | This is version 0.4 of PyInventor and only allows for individual part creation and export. Not all 3D functionality has been added. The demos (located in the _Totorial_Notebooks folder) demonstrate the current extents of 16 | PyInventor's capabilities. New revisions will likely be added in time. 17 | 18 | RECOMMENDED INSTALL PROCESS: 19 | ________________________________________________________________ 20 | Open a cmd window and run: python setup.py install 21 | 22 | Then import pyinvent directly 23 | 24 | 25 | ~Andrew Oriani 26 | oriani@uchicago.edu 27 | -------------------------------------------------------------------------------- /_Tutorial_Notebooks/00000_arc_test.stp: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | /* Generated by software containing ST-Developer 4 | * from STEP Tools, Inc. (www.steptools.com) 5 | */ 6 | 7 | FILE_DESCRIPTION( 8 | /* description */ (''), 9 | /* implementation_level */ '2;1'); 10 | 11 | FILE_NAME( 12 | /* name */ 13 | 'S:\\Andrew Oriani\\CQED 3D Resonators\\Quantum Flute Cavities\\Invent 14 | or API\\PyInventor\\_Tutorial_Notebooks\\00000_arc_test.stp', 15 | /* time_stamp */ '2020-10-20T21:09:59-05:00', 16 | /* author */ ('oriani'), 17 | /* organization */ (''), 18 | /* preprocessor_version */ 'ST-DEVELOPER v17', 19 | /* originating_system */ 'Autodesk Inventor 2019', 20 | /* authorisation */ ''); 21 | 22 | FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }')); 23 | ENDSEC; 24 | 25 | DATA; 26 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#327); 27 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#337,#12); 28 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#326); 29 | #13=STYLED_ITEM('',(#346),#14); 30 | #14=MANIFOLD_SOLID_BREP('Solid1',#186); 31 | #15=FACE_BOUND('',#45,.T.); 32 | #16=PLANE('',#206); 33 | #17=PLANE('',#207); 34 | #18=PLANE('',#211); 35 | #19=PLANE('',#215); 36 | #20=PLANE('',#216); 37 | #21=PLANE('',#217); 38 | #22=CYLINDRICAL_SURFACE('',#203,0.078); 39 | #23=CYLINDRICAL_SURFACE('',#208,1.); 40 | #24=CYLINDRICAL_SURFACE('',#212,1.); 41 | #25=FACE_OUTER_BOUND('',#35,.T.); 42 | #26=FACE_OUTER_BOUND('',#36,.T.); 43 | #27=FACE_OUTER_BOUND('',#37,.T.); 44 | #28=FACE_OUTER_BOUND('',#38,.T.); 45 | #29=FACE_OUTER_BOUND('',#39,.T.); 46 | #30=FACE_OUTER_BOUND('',#40,.T.); 47 | #31=FACE_OUTER_BOUND('',#41,.T.); 48 | #32=FACE_OUTER_BOUND('',#42,.T.); 49 | #33=FACE_OUTER_BOUND('',#43,.T.); 50 | #34=FACE_OUTER_BOUND('',#44,.T.); 51 | #35=EDGE_LOOP('',(#127,#128,#129,#130)); 52 | #36=EDGE_LOOP('',(#131,#132,#133,#134,#135,#136)); 53 | #37=EDGE_LOOP('',(#137,#138,#139,#140)); 54 | #38=EDGE_LOOP('',(#141,#142,#143,#144)); 55 | #39=EDGE_LOOP('',(#145,#146,#147,#148)); 56 | #40=EDGE_LOOP('',(#149,#150,#151,#152)); 57 | #41=EDGE_LOOP('',(#153,#154,#155,#156)); 58 | #42=EDGE_LOOP('',(#157,#158,#159,#160)); 59 | #43=EDGE_LOOP('',(#161,#162,#163,#164,#165,#166)); 60 | #44=EDGE_LOOP('',(#167,#168,#169,#170,#171,#172)); 61 | #45=EDGE_LOOP('',(#173,#174)); 62 | #46=LINE('',#279,#62); 63 | #47=LINE('',#285,#63); 64 | #48=LINE('',#289,#64); 65 | #49=LINE('',#291,#65); 66 | #50=LINE('',#293,#66); 67 | #51=LINE('',#294,#67); 68 | #52=LINE('',#297,#68); 69 | #53=LINE('',#299,#69); 70 | #54=LINE('',#300,#70); 71 | #55=LINE('',#306,#71); 72 | #56=LINE('',#309,#72); 73 | #57=LINE('',#311,#73); 74 | #58=LINE('',#312,#74); 75 | #59=LINE('',#318,#75); 76 | #60=LINE('',#320,#76); 77 | #61=LINE('',#321,#77); 78 | #62=VECTOR('',#226,0.039); 79 | #63=VECTOR('',#233,0.078); 80 | #64=VECTOR('',#236,0.393700787401575); 81 | #65=VECTOR('',#237,0.393700787401575); 82 | #66=VECTOR('',#238,0.393700787401575); 83 | #67=VECTOR('',#239,0.393700787401575); 84 | #68=VECTOR('',#242,0.393700787401575); 85 | #69=VECTOR('',#243,0.393700787401575); 86 | #70=VECTOR('',#244,0.393700787401575); 87 | #71=VECTOR('',#251,0.393700787401575); 88 | #72=VECTOR('',#254,0.393700787401575); 89 | #73=VECTOR('',#255,0.393700787401575); 90 | #74=VECTOR('',#256,0.393700787401575); 91 | #75=VECTOR('',#263,0.393700787401575); 92 | #76=VECTOR('',#266,0.393700787401575); 93 | #77=VECTOR('',#267,0.393700787401575); 94 | #78=CIRCLE('',#201,0.078); 95 | #79=CIRCLE('',#202,0.078); 96 | #80=CIRCLE('',#204,0.078); 97 | #81=CIRCLE('',#205,0.078); 98 | #82=CIRCLE('',#209,1.); 99 | #83=CIRCLE('',#210,1.); 100 | #84=CIRCLE('',#213,1.); 101 | #85=CIRCLE('',#214,1.); 102 | #86=VERTEX_POINT('',#274); 103 | #87=VERTEX_POINT('',#275); 104 | #88=VERTEX_POINT('',#278); 105 | #89=VERTEX_POINT('',#281); 106 | #90=VERTEX_POINT('',#282); 107 | #91=VERTEX_POINT('',#287); 108 | #92=VERTEX_POINT('',#288); 109 | #93=VERTEX_POINT('',#290); 110 | #94=VERTEX_POINT('',#292); 111 | #95=VERTEX_POINT('',#296); 112 | #96=VERTEX_POINT('',#298); 113 | #97=VERTEX_POINT('',#302); 114 | #98=VERTEX_POINT('',#304); 115 | #99=VERTEX_POINT('',#308); 116 | #100=VERTEX_POINT('',#310); 117 | #101=VERTEX_POINT('',#314); 118 | #102=VERTEX_POINT('',#316); 119 | #103=EDGE_CURVE('',#86,#87,#78,.T.); 120 | #104=EDGE_CURVE('',#87,#86,#79,.T.); 121 | #105=EDGE_CURVE('',#87,#88,#46,.T.); 122 | #106=EDGE_CURVE('',#89,#90,#80,.T.); 123 | #107=EDGE_CURVE('',#90,#89,#81,.T.); 124 | #108=EDGE_CURVE('',#90,#87,#47,.T.); 125 | #109=EDGE_CURVE('',#91,#92,#48,.T.); 126 | #110=EDGE_CURVE('',#92,#93,#49,.T.); 127 | #111=EDGE_CURVE('',#94,#93,#50,.T.); 128 | #112=EDGE_CURVE('',#91,#94,#51,.T.); 129 | #113=EDGE_CURVE('',#95,#91,#52,.T.); 130 | #114=EDGE_CURVE('',#96,#94,#53,.T.); 131 | #115=EDGE_CURVE('',#95,#96,#54,.T.); 132 | #116=EDGE_CURVE('',#97,#95,#82,.T.); 133 | #117=EDGE_CURVE('',#98,#96,#83,.T.); 134 | #118=EDGE_CURVE('',#97,#98,#55,.T.); 135 | #119=EDGE_CURVE('',#99,#97,#56,.T.); 136 | #120=EDGE_CURVE('',#100,#98,#57,.T.); 137 | #121=EDGE_CURVE('',#99,#100,#58,.T.); 138 | #122=EDGE_CURVE('',#101,#99,#84,.T.); 139 | #123=EDGE_CURVE('',#102,#100,#85,.T.); 140 | #124=EDGE_CURVE('',#101,#102,#59,.T.); 141 | #125=EDGE_CURVE('',#92,#101,#60,.T.); 142 | #126=EDGE_CURVE('',#93,#102,#61,.T.); 143 | #127=ORIENTED_EDGE('',*,*,#103,.F.); 144 | #128=ORIENTED_EDGE('',*,*,#104,.F.); 145 | #129=ORIENTED_EDGE('',*,*,#105,.T.); 146 | #130=ORIENTED_EDGE('',*,*,#105,.F.); 147 | #131=ORIENTED_EDGE('',*,*,#106,.F.); 148 | #132=ORIENTED_EDGE('',*,*,#107,.F.); 149 | #133=ORIENTED_EDGE('',*,*,#108,.T.); 150 | #134=ORIENTED_EDGE('',*,*,#104,.T.); 151 | #135=ORIENTED_EDGE('',*,*,#103,.T.); 152 | #136=ORIENTED_EDGE('',*,*,#108,.F.); 153 | #137=ORIENTED_EDGE('',*,*,#109,.T.); 154 | #138=ORIENTED_EDGE('',*,*,#110,.T.); 155 | #139=ORIENTED_EDGE('',*,*,#111,.F.); 156 | #140=ORIENTED_EDGE('',*,*,#112,.F.); 157 | #141=ORIENTED_EDGE('',*,*,#113,.T.); 158 | #142=ORIENTED_EDGE('',*,*,#112,.T.); 159 | #143=ORIENTED_EDGE('',*,*,#114,.F.); 160 | #144=ORIENTED_EDGE('',*,*,#115,.F.); 161 | #145=ORIENTED_EDGE('',*,*,#116,.T.); 162 | #146=ORIENTED_EDGE('',*,*,#115,.T.); 163 | #147=ORIENTED_EDGE('',*,*,#117,.F.); 164 | #148=ORIENTED_EDGE('',*,*,#118,.F.); 165 | #149=ORIENTED_EDGE('',*,*,#119,.T.); 166 | #150=ORIENTED_EDGE('',*,*,#118,.T.); 167 | #151=ORIENTED_EDGE('',*,*,#120,.F.); 168 | #152=ORIENTED_EDGE('',*,*,#121,.F.); 169 | #153=ORIENTED_EDGE('',*,*,#122,.T.); 170 | #154=ORIENTED_EDGE('',*,*,#121,.T.); 171 | #155=ORIENTED_EDGE('',*,*,#123,.F.); 172 | #156=ORIENTED_EDGE('',*,*,#124,.F.); 173 | #157=ORIENTED_EDGE('',*,*,#125,.T.); 174 | #158=ORIENTED_EDGE('',*,*,#124,.T.); 175 | #159=ORIENTED_EDGE('',*,*,#126,.F.); 176 | #160=ORIENTED_EDGE('',*,*,#110,.F.); 177 | #161=ORIENTED_EDGE('',*,*,#126,.T.); 178 | #162=ORIENTED_EDGE('',*,*,#123,.T.); 179 | #163=ORIENTED_EDGE('',*,*,#120,.T.); 180 | #164=ORIENTED_EDGE('',*,*,#117,.T.); 181 | #165=ORIENTED_EDGE('',*,*,#114,.T.); 182 | #166=ORIENTED_EDGE('',*,*,#111,.T.); 183 | #167=ORIENTED_EDGE('',*,*,#125,.F.); 184 | #168=ORIENTED_EDGE('',*,*,#109,.F.); 185 | #169=ORIENTED_EDGE('',*,*,#113,.F.); 186 | #170=ORIENTED_EDGE('',*,*,#116,.F.); 187 | #171=ORIENTED_EDGE('',*,*,#119,.F.); 188 | #172=ORIENTED_EDGE('',*,*,#122,.F.); 189 | #173=ORIENTED_EDGE('',*,*,#106,.T.); 190 | #174=ORIENTED_EDGE('',*,*,#107,.T.); 191 | #175=CONICAL_SURFACE('',#200,0.039,1.02974425867665); 192 | #176=ADVANCED_FACE('',(#25),#175,.F.); 193 | #177=ADVANCED_FACE('',(#26),#22,.F.); 194 | #178=ADVANCED_FACE('',(#27),#16,.T.); 195 | #179=ADVANCED_FACE('',(#28),#17,.T.); 196 | #180=ADVANCED_FACE('',(#29),#23,.T.); 197 | #181=ADVANCED_FACE('',(#30),#18,.T.); 198 | #182=ADVANCED_FACE('',(#31),#24,.T.); 199 | #183=ADVANCED_FACE('',(#32),#19,.T.); 200 | #184=ADVANCED_FACE('',(#33),#20,.T.); 201 | #185=ADVANCED_FACE('',(#34,#15),#21,.F.); 202 | #186=CLOSED_SHELL('',(#176,#177,#178,#179,#180,#181,#182,#183,#184,#185)); 203 | #187=DERIVED_UNIT_ELEMENT(#189,1.); 204 | #188=DERIVED_UNIT_ELEMENT(#331,3.); 205 | #189=( 206 | MASS_UNIT() 207 | NAMED_UNIT(*) 208 | SI_UNIT($,.GRAM.) 209 | ); 210 | #190=DERIVED_UNIT((#187,#188)); 211 | #191=MEASURE_REPRESENTATION_ITEM('density measure', 212 | POSITIVE_RATIO_MEASURE(1.),#190); 213 | #192=PROPERTY_DEFINITION_REPRESENTATION(#197,#194); 214 | #193=PROPERTY_DEFINITION_REPRESENTATION(#198,#195); 215 | #194=REPRESENTATION('material name',(#196),#326); 216 | #195=REPRESENTATION('density',(#191),#326); 217 | #196=DESCRIPTIVE_REPRESENTATION_ITEM('Generic','Generic'); 218 | #197=PROPERTY_DEFINITION('material property','material name',#339); 219 | #198=PROPERTY_DEFINITION('material property','density of part',#339); 220 | #199=AXIS2_PLACEMENT_3D('placement',#272,#218,#219); 221 | #200=AXIS2_PLACEMENT_3D('',#273,#220,#221); 222 | #201=AXIS2_PLACEMENT_3D('',#276,#222,#223); 223 | #202=AXIS2_PLACEMENT_3D('',#277,#224,#225); 224 | #203=AXIS2_PLACEMENT_3D('',#280,#227,#228); 225 | #204=AXIS2_PLACEMENT_3D('',#283,#229,#230); 226 | #205=AXIS2_PLACEMENT_3D('',#284,#231,#232); 227 | #206=AXIS2_PLACEMENT_3D('',#286,#234,#235); 228 | #207=AXIS2_PLACEMENT_3D('',#295,#240,#241); 229 | #208=AXIS2_PLACEMENT_3D('',#301,#245,#246); 230 | #209=AXIS2_PLACEMENT_3D('',#303,#247,#248); 231 | #210=AXIS2_PLACEMENT_3D('',#305,#249,#250); 232 | #211=AXIS2_PLACEMENT_3D('',#307,#252,#253); 233 | #212=AXIS2_PLACEMENT_3D('',#313,#257,#258); 234 | #213=AXIS2_PLACEMENT_3D('',#315,#259,#260); 235 | #214=AXIS2_PLACEMENT_3D('',#317,#261,#262); 236 | #215=AXIS2_PLACEMENT_3D('',#319,#264,#265); 237 | #216=AXIS2_PLACEMENT_3D('',#322,#268,#269); 238 | #217=AXIS2_PLACEMENT_3D('',#323,#270,#271); 239 | #218=DIRECTION('axis',(0.,0.,1.)); 240 | #219=DIRECTION('refdir',(1.,0.,0.)); 241 | #220=DIRECTION('center_axis',(0.,0.,-1.)); 242 | #221=DIRECTION('ref_axis',(1.,0.,0.)); 243 | #222=DIRECTION('center_axis',(0.,0.,1.)); 244 | #223=DIRECTION('ref_axis',(1.,0.,0.)); 245 | #224=DIRECTION('center_axis',(0.,0.,1.)); 246 | #225=DIRECTION('ref_axis',(1.,0.,0.)); 247 | #226=DIRECTION('',(0.857167300702112,1.04972719113862E-16,0.515038074910054)); 248 | #227=DIRECTION('center_axis',(0.,0.,1.)); 249 | #228=DIRECTION('ref_axis',(1.,0.,0.)); 250 | #229=DIRECTION('center_axis',(0.,0.,1.)); 251 | #230=DIRECTION('ref_axis',(1.,0.,0.)); 252 | #231=DIRECTION('center_axis',(0.,0.,1.)); 253 | #232=DIRECTION('ref_axis',(1.,0.,0.)); 254 | #233=DIRECTION('',(0.,0.,1.)); 255 | #234=DIRECTION('center_axis',(0.,-1.,0.)); 256 | #235=DIRECTION('ref_axis',(1.,0.,0.)); 257 | #236=DIRECTION('',(1.,0.,0.)); 258 | #237=DIRECTION('',(0.,0.,1.)); 259 | #238=DIRECTION('',(1.,0.,0.)); 260 | #239=DIRECTION('',(0.,0.,1.)); 261 | #240=DIRECTION('center_axis',(-1.,0.,0.)); 262 | #241=DIRECTION('ref_axis',(0.,-1.,0.)); 263 | #242=DIRECTION('',(0.,-1.,0.)); 264 | #243=DIRECTION('',(0.,-1.,0.)); 265 | #244=DIRECTION('',(0.,0.,1.)); 266 | #245=DIRECTION('center_axis',(0.,0.,1.)); 267 | #246=DIRECTION('ref_axis',(0.,1.,0.)); 268 | #247=DIRECTION('center_axis',(0.,0.,1.)); 269 | #248=DIRECTION('ref_axis',(0.,1.,0.)); 270 | #249=DIRECTION('center_axis',(0.,0.,1.)); 271 | #250=DIRECTION('ref_axis',(0.,1.,0.)); 272 | #251=DIRECTION('',(0.,0.,1.)); 273 | #252=DIRECTION('center_axis',(0.,1.,0.)); 274 | #253=DIRECTION('ref_axis',(-1.,0.,0.)); 275 | #254=DIRECTION('',(-1.,0.,0.)); 276 | #255=DIRECTION('',(-1.,0.,0.)); 277 | #256=DIRECTION('',(0.,0.,1.)); 278 | #257=DIRECTION('center_axis',(0.,0.,1.)); 279 | #258=DIRECTION('ref_axis',(1.,0.,0.)); 280 | #259=DIRECTION('center_axis',(0.,0.,1.)); 281 | #260=DIRECTION('ref_axis',(1.,0.,0.)); 282 | #261=DIRECTION('center_axis',(0.,0.,1.)); 283 | #262=DIRECTION('ref_axis',(1.,0.,0.)); 284 | #263=DIRECTION('',(0.,0.,1.)); 285 | #264=DIRECTION('center_axis',(1.,0.,0.)); 286 | #265=DIRECTION('ref_axis',(0.,1.,0.)); 287 | #266=DIRECTION('',(0.,1.,0.)); 288 | #267=DIRECTION('',(0.,1.,0.)); 289 | #268=DIRECTION('center_axis',(0.,0.,1.)); 290 | #269=DIRECTION('ref_axis',(1.,0.,0.)); 291 | #270=DIRECTION('center_axis',(0.,0.,1.)); 292 | #271=DIRECTION('ref_axis',(1.,0.,0.)); 293 | #272=CARTESIAN_POINT('',(0.,0.,0.)); 294 | #273=CARTESIAN_POINT('Origin',(-1.5,0.5,0.523433564142075)); 295 | #274=CARTESIAN_POINT('',(-1.422,0.5,0.5)); 296 | #275=CARTESIAN_POINT('',(-1.578,0.5,0.5)); 297 | #276=CARTESIAN_POINT('Origin',(-1.5,0.5,0.5)); 298 | #277=CARTESIAN_POINT('Origin',(-1.5,0.5,0.5)); 299 | #278=CARTESIAN_POINT('',(-1.5,0.5,0.54686712828415)); 300 | #279=CARTESIAN_POINT('',(-1.539,0.5,0.523433564142075)); 301 | #280=CARTESIAN_POINT('Origin',(-1.5,0.5,0.25)); 302 | #281=CARTESIAN_POINT('',(-1.422,0.5,0.)); 303 | #282=CARTESIAN_POINT('',(-1.578,0.5,0.)); 304 | #283=CARTESIAN_POINT('Origin',(-1.5,0.5,0.)); 305 | #284=CARTESIAN_POINT('Origin',(-1.5,0.5,0.)); 306 | #285=CARTESIAN_POINT('',(-1.578,0.5,0.25)); 307 | #286=CARTESIAN_POINT('Origin',(-3.,0.,0.)); 308 | #287=CARTESIAN_POINT('',(-3.,0.,0.)); 309 | #288=CARTESIAN_POINT('',(0.,0.,0.)); 310 | #289=CARTESIAN_POINT('',(-3.,0.,0.)); 311 | #290=CARTESIAN_POINT('',(0.,0.,1.)); 312 | #291=CARTESIAN_POINT('',(0.,0.,0.)); 313 | #292=CARTESIAN_POINT('',(-3.,0.,1.)); 314 | #293=CARTESIAN_POINT('',(-3.,0.,1.)); 315 | #294=CARTESIAN_POINT('',(-3.,0.,0.)); 316 | #295=CARTESIAN_POINT('Origin',(-3.,1.,0.)); 317 | #296=CARTESIAN_POINT('',(-3.,1.,0.)); 318 | #297=CARTESIAN_POINT('',(-3.,1.,0.)); 319 | #298=CARTESIAN_POINT('',(-3.,1.,1.)); 320 | #299=CARTESIAN_POINT('',(-3.,1.,1.)); 321 | #300=CARTESIAN_POINT('',(-3.,1.,0.)); 322 | #301=CARTESIAN_POINT('Origin',(-2.,1.,0.)); 323 | #302=CARTESIAN_POINT('',(-2.,2.,0.)); 324 | #303=CARTESIAN_POINT('Origin',(-2.,1.,0.)); 325 | #304=CARTESIAN_POINT('',(-2.,2.,1.)); 326 | #305=CARTESIAN_POINT('Origin',(-2.,1.,1.)); 327 | #306=CARTESIAN_POINT('',(-2.,2.,0.)); 328 | #307=CARTESIAN_POINT('Origin',(-1.,2.,0.)); 329 | #308=CARTESIAN_POINT('',(-1.,2.,0.)); 330 | #309=CARTESIAN_POINT('',(-1.,2.,0.)); 331 | #310=CARTESIAN_POINT('',(-1.,2.,1.)); 332 | #311=CARTESIAN_POINT('',(-1.,2.,1.)); 333 | #312=CARTESIAN_POINT('',(-1.,2.,0.)); 334 | #313=CARTESIAN_POINT('Origin',(-1.,1.,0.)); 335 | #314=CARTESIAN_POINT('',(0.,1.,0.)); 336 | #315=CARTESIAN_POINT('Origin',(-1.,1.,0.)); 337 | #316=CARTESIAN_POINT('',(0.,1.,1.)); 338 | #317=CARTESIAN_POINT('Origin',(-1.,1.,1.)); 339 | #318=CARTESIAN_POINT('',(0.,1.,0.)); 340 | #319=CARTESIAN_POINT('Origin',(0.,0.,0.)); 341 | #320=CARTESIAN_POINT('',(0.,0.,0.)); 342 | #321=CARTESIAN_POINT('',(0.,0.,1.)); 343 | #322=CARTESIAN_POINT('Origin',(-1.5,0.820492542779672,1.)); 344 | #323=CARTESIAN_POINT('Origin',(-1.5,0.820492542779672,0.)); 345 | #324=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 346 | #329,'DISTANCE_ACCURACY_VALUE', 347 | 'Maximum model space distance between geometric entities at asserted c 348 | onnectivities'); 349 | #325=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 350 | #329,'DISTANCE_ACCURACY_VALUE', 351 | 'Maximum model space distance between geometric entities at asserted c 352 | onnectivities'); 353 | #326=( 354 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 355 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#324)) 356 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#329,#334,#333)) 357 | REPRESENTATION_CONTEXT('','3D') 358 | ); 359 | #327=( 360 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 361 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#325)) 362 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#329,#334,#333)) 363 | REPRESENTATION_CONTEXT('','3D') 364 | ); 365 | #328=DIMENSIONAL_EXPONENTS(1.,0.,0.,0.,0.,0.,0.); 366 | #329=( 367 | CONVERSION_BASED_UNIT('inch',#332) 368 | LENGTH_UNIT() 369 | NAMED_UNIT(#328) 370 | ); 371 | #330=( 372 | LENGTH_UNIT() 373 | NAMED_UNIT(*) 374 | SI_UNIT(.MILLI.,.METRE.) 375 | ); 376 | #331=( 377 | LENGTH_UNIT() 378 | NAMED_UNIT(*) 379 | SI_UNIT(.CENTI.,.METRE.) 380 | ); 381 | #332=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#330); 382 | #333=( 383 | NAMED_UNIT(*) 384 | SI_UNIT($,.STERADIAN.) 385 | SOLID_ANGLE_UNIT() 386 | ); 387 | #334=( 388 | NAMED_UNIT(*) 389 | PLANE_ANGLE_UNIT() 390 | SI_UNIT($,.RADIAN.) 391 | ); 392 | #335=SHAPE_DEFINITION_REPRESENTATION(#336,#337); 393 | #336=PRODUCT_DEFINITION_SHAPE('',$,#339); 394 | #337=SHAPE_REPRESENTATION('',(#199),#326); 395 | #338=PRODUCT_DEFINITION_CONTEXT('part definition',#343,'design'); 396 | #339=PRODUCT_DEFINITION('00000_arc_test','00000_arc_test',#340,#338); 397 | #340=PRODUCT_DEFINITION_FORMATION('',$,#345); 398 | #341=PRODUCT_RELATED_PRODUCT_CATEGORY('00000_arc_test','00000_arc_test', 399 | (#345)); 400 | #342=APPLICATION_PROTOCOL_DEFINITION('international standard', 401 | 'automotive_design',2009,#343); 402 | #343=APPLICATION_CONTEXT( 403 | 'Core Data for Automotive Mechanical Design Process'); 404 | #344=PRODUCT_CONTEXT('part definition',#343,'mechanical'); 405 | #345=PRODUCT('00000_arc_test','00000_arc_test',$,(#344)); 406 | #346=PRESENTATION_STYLE_ASSIGNMENT((#347)); 407 | #347=SURFACE_STYLE_USAGE(.BOTH.,#348); 408 | #348=SURFACE_SIDE_STYLE('',(#349)); 409 | #349=SURFACE_STYLE_FILL_AREA(#350); 410 | #350=FILL_AREA_STYLE('',(#351)); 411 | #351=FILL_AREA_STYLE_COLOUR('',#352); 412 | #352=COLOUR_RGB('',0.749019607843137,0.749019607843137,0.749019607843137); 413 | ENDSEC; 414 | END-ISO-10303-21; 415 | -------------------------------------------------------------------------------- /_Tutorial_Notebooks/00001_arc_test.stp: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | /* Generated by software containing ST-Developer 4 | * from STEP Tools, Inc. (www.steptools.com) 5 | */ 6 | 7 | FILE_DESCRIPTION( 8 | /* description */ (''), 9 | /* implementation_level */ '2;1'); 10 | 11 | FILE_NAME( 12 | /* name */ 13 | 'S:\\Andrew Oriani\\CQED 3D Resonators\\Quantum Flute Cavities\\Invent 14 | or API\\PyInventor\\_Tutorial_Notebooks\\00001_arc_test.stp', 15 | /* time_stamp */ '2020-10-20T22:38:08-05:00', 16 | /* author */ ('oriani'), 17 | /* organization */ (''), 18 | /* preprocessor_version */ 'ST-DEVELOPER v17', 19 | /* originating_system */ 'Autodesk Inventor 2019', 20 | /* authorisation */ ''); 21 | 22 | FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }')); 23 | ENDSEC; 24 | 25 | DATA; 26 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#327); 27 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#337,#12); 28 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#326); 29 | #13=STYLED_ITEM('',(#346),#14); 30 | #14=MANIFOLD_SOLID_BREP('Solid1',#186); 31 | #15=FACE_BOUND('',#45,.T.); 32 | #16=PLANE('',#206); 33 | #17=PLANE('',#207); 34 | #18=PLANE('',#211); 35 | #19=PLANE('',#215); 36 | #20=PLANE('',#216); 37 | #21=PLANE('',#217); 38 | #22=CYLINDRICAL_SURFACE('',#203,0.078); 39 | #23=CYLINDRICAL_SURFACE('',#208,1.); 40 | #24=CYLINDRICAL_SURFACE('',#212,1.); 41 | #25=FACE_OUTER_BOUND('',#35,.T.); 42 | #26=FACE_OUTER_BOUND('',#36,.T.); 43 | #27=FACE_OUTER_BOUND('',#37,.T.); 44 | #28=FACE_OUTER_BOUND('',#38,.T.); 45 | #29=FACE_OUTER_BOUND('',#39,.T.); 46 | #30=FACE_OUTER_BOUND('',#40,.T.); 47 | #31=FACE_OUTER_BOUND('',#41,.T.); 48 | #32=FACE_OUTER_BOUND('',#42,.T.); 49 | #33=FACE_OUTER_BOUND('',#43,.T.); 50 | #34=FACE_OUTER_BOUND('',#44,.T.); 51 | #35=EDGE_LOOP('',(#127,#128,#129,#130)); 52 | #36=EDGE_LOOP('',(#131,#132,#133,#134,#135,#136)); 53 | #37=EDGE_LOOP('',(#137,#138,#139,#140)); 54 | #38=EDGE_LOOP('',(#141,#142,#143,#144)); 55 | #39=EDGE_LOOP('',(#145,#146,#147,#148)); 56 | #40=EDGE_LOOP('',(#149,#150,#151,#152)); 57 | #41=EDGE_LOOP('',(#153,#154,#155,#156)); 58 | #42=EDGE_LOOP('',(#157,#158,#159,#160)); 59 | #43=EDGE_LOOP('',(#161,#162,#163,#164,#165,#166)); 60 | #44=EDGE_LOOP('',(#167,#168,#169,#170,#171,#172)); 61 | #45=EDGE_LOOP('',(#173,#174)); 62 | #46=LINE('',#279,#62); 63 | #47=LINE('',#285,#63); 64 | #48=LINE('',#289,#64); 65 | #49=LINE('',#291,#65); 66 | #50=LINE('',#293,#66); 67 | #51=LINE('',#294,#67); 68 | #52=LINE('',#297,#68); 69 | #53=LINE('',#299,#69); 70 | #54=LINE('',#300,#70); 71 | #55=LINE('',#306,#71); 72 | #56=LINE('',#309,#72); 73 | #57=LINE('',#311,#73); 74 | #58=LINE('',#312,#74); 75 | #59=LINE('',#318,#75); 76 | #60=LINE('',#320,#76); 77 | #61=LINE('',#321,#77); 78 | #62=VECTOR('',#226,0.039); 79 | #63=VECTOR('',#233,0.078); 80 | #64=VECTOR('',#236,0.393700787401575); 81 | #65=VECTOR('',#237,0.393700787401575); 82 | #66=VECTOR('',#238,0.393700787401575); 83 | #67=VECTOR('',#239,0.393700787401575); 84 | #68=VECTOR('',#242,0.393700787401575); 85 | #69=VECTOR('',#243,0.393700787401575); 86 | #70=VECTOR('',#244,0.393700787401575); 87 | #71=VECTOR('',#251,0.393700787401575); 88 | #72=VECTOR('',#254,0.393700787401575); 89 | #73=VECTOR('',#255,0.393700787401575); 90 | #74=VECTOR('',#256,0.393700787401575); 91 | #75=VECTOR('',#263,0.393700787401575); 92 | #76=VECTOR('',#266,0.393700787401575); 93 | #77=VECTOR('',#267,0.393700787401575); 94 | #78=CIRCLE('',#201,0.078); 95 | #79=CIRCLE('',#202,0.078); 96 | #80=CIRCLE('',#204,0.078); 97 | #81=CIRCLE('',#205,0.078); 98 | #82=CIRCLE('',#209,1.); 99 | #83=CIRCLE('',#210,1.); 100 | #84=CIRCLE('',#213,1.); 101 | #85=CIRCLE('',#214,1.); 102 | #86=VERTEX_POINT('',#274); 103 | #87=VERTEX_POINT('',#275); 104 | #88=VERTEX_POINT('',#278); 105 | #89=VERTEX_POINT('',#281); 106 | #90=VERTEX_POINT('',#282); 107 | #91=VERTEX_POINT('',#287); 108 | #92=VERTEX_POINT('',#288); 109 | #93=VERTEX_POINT('',#290); 110 | #94=VERTEX_POINT('',#292); 111 | #95=VERTEX_POINT('',#296); 112 | #96=VERTEX_POINT('',#298); 113 | #97=VERTEX_POINT('',#302); 114 | #98=VERTEX_POINT('',#304); 115 | #99=VERTEX_POINT('',#308); 116 | #100=VERTEX_POINT('',#310); 117 | #101=VERTEX_POINT('',#314); 118 | #102=VERTEX_POINT('',#316); 119 | #103=EDGE_CURVE('',#86,#87,#78,.T.); 120 | #104=EDGE_CURVE('',#87,#86,#79,.T.); 121 | #105=EDGE_CURVE('',#87,#88,#46,.T.); 122 | #106=EDGE_CURVE('',#89,#90,#80,.T.); 123 | #107=EDGE_CURVE('',#90,#89,#81,.T.); 124 | #108=EDGE_CURVE('',#90,#87,#47,.T.); 125 | #109=EDGE_CURVE('',#91,#92,#48,.T.); 126 | #110=EDGE_CURVE('',#92,#93,#49,.T.); 127 | #111=EDGE_CURVE('',#94,#93,#50,.T.); 128 | #112=EDGE_CURVE('',#91,#94,#51,.T.); 129 | #113=EDGE_CURVE('',#95,#91,#52,.T.); 130 | #114=EDGE_CURVE('',#96,#94,#53,.T.); 131 | #115=EDGE_CURVE('',#95,#96,#54,.T.); 132 | #116=EDGE_CURVE('',#97,#95,#82,.T.); 133 | #117=EDGE_CURVE('',#98,#96,#83,.T.); 134 | #118=EDGE_CURVE('',#97,#98,#55,.T.); 135 | #119=EDGE_CURVE('',#99,#97,#56,.T.); 136 | #120=EDGE_CURVE('',#100,#98,#57,.T.); 137 | #121=EDGE_CURVE('',#99,#100,#58,.T.); 138 | #122=EDGE_CURVE('',#101,#99,#84,.T.); 139 | #123=EDGE_CURVE('',#102,#100,#85,.T.); 140 | #124=EDGE_CURVE('',#101,#102,#59,.T.); 141 | #125=EDGE_CURVE('',#92,#101,#60,.T.); 142 | #126=EDGE_CURVE('',#93,#102,#61,.T.); 143 | #127=ORIENTED_EDGE('',*,*,#103,.F.); 144 | #128=ORIENTED_EDGE('',*,*,#104,.F.); 145 | #129=ORIENTED_EDGE('',*,*,#105,.T.); 146 | #130=ORIENTED_EDGE('',*,*,#105,.F.); 147 | #131=ORIENTED_EDGE('',*,*,#106,.F.); 148 | #132=ORIENTED_EDGE('',*,*,#107,.F.); 149 | #133=ORIENTED_EDGE('',*,*,#108,.T.); 150 | #134=ORIENTED_EDGE('',*,*,#104,.T.); 151 | #135=ORIENTED_EDGE('',*,*,#103,.T.); 152 | #136=ORIENTED_EDGE('',*,*,#108,.F.); 153 | #137=ORIENTED_EDGE('',*,*,#109,.T.); 154 | #138=ORIENTED_EDGE('',*,*,#110,.T.); 155 | #139=ORIENTED_EDGE('',*,*,#111,.F.); 156 | #140=ORIENTED_EDGE('',*,*,#112,.F.); 157 | #141=ORIENTED_EDGE('',*,*,#113,.T.); 158 | #142=ORIENTED_EDGE('',*,*,#112,.T.); 159 | #143=ORIENTED_EDGE('',*,*,#114,.F.); 160 | #144=ORIENTED_EDGE('',*,*,#115,.F.); 161 | #145=ORIENTED_EDGE('',*,*,#116,.T.); 162 | #146=ORIENTED_EDGE('',*,*,#115,.T.); 163 | #147=ORIENTED_EDGE('',*,*,#117,.F.); 164 | #148=ORIENTED_EDGE('',*,*,#118,.F.); 165 | #149=ORIENTED_EDGE('',*,*,#119,.T.); 166 | #150=ORIENTED_EDGE('',*,*,#118,.T.); 167 | #151=ORIENTED_EDGE('',*,*,#120,.F.); 168 | #152=ORIENTED_EDGE('',*,*,#121,.F.); 169 | #153=ORIENTED_EDGE('',*,*,#122,.T.); 170 | #154=ORIENTED_EDGE('',*,*,#121,.T.); 171 | #155=ORIENTED_EDGE('',*,*,#123,.F.); 172 | #156=ORIENTED_EDGE('',*,*,#124,.F.); 173 | #157=ORIENTED_EDGE('',*,*,#125,.T.); 174 | #158=ORIENTED_EDGE('',*,*,#124,.T.); 175 | #159=ORIENTED_EDGE('',*,*,#126,.F.); 176 | #160=ORIENTED_EDGE('',*,*,#110,.F.); 177 | #161=ORIENTED_EDGE('',*,*,#126,.T.); 178 | #162=ORIENTED_EDGE('',*,*,#123,.T.); 179 | #163=ORIENTED_EDGE('',*,*,#120,.T.); 180 | #164=ORIENTED_EDGE('',*,*,#117,.T.); 181 | #165=ORIENTED_EDGE('',*,*,#114,.T.); 182 | #166=ORIENTED_EDGE('',*,*,#111,.T.); 183 | #167=ORIENTED_EDGE('',*,*,#125,.F.); 184 | #168=ORIENTED_EDGE('',*,*,#109,.F.); 185 | #169=ORIENTED_EDGE('',*,*,#113,.F.); 186 | #170=ORIENTED_EDGE('',*,*,#116,.F.); 187 | #171=ORIENTED_EDGE('',*,*,#119,.F.); 188 | #172=ORIENTED_EDGE('',*,*,#122,.F.); 189 | #173=ORIENTED_EDGE('',*,*,#106,.T.); 190 | #174=ORIENTED_EDGE('',*,*,#107,.T.); 191 | #175=CONICAL_SURFACE('',#200,0.039,1.02974425867665); 192 | #176=ADVANCED_FACE('',(#25),#175,.F.); 193 | #177=ADVANCED_FACE('',(#26),#22,.F.); 194 | #178=ADVANCED_FACE('',(#27),#16,.T.); 195 | #179=ADVANCED_FACE('',(#28),#17,.T.); 196 | #180=ADVANCED_FACE('',(#29),#23,.T.); 197 | #181=ADVANCED_FACE('',(#30),#18,.T.); 198 | #182=ADVANCED_FACE('',(#31),#24,.T.); 199 | #183=ADVANCED_FACE('',(#32),#19,.T.); 200 | #184=ADVANCED_FACE('',(#33),#20,.T.); 201 | #185=ADVANCED_FACE('',(#34,#15),#21,.F.); 202 | #186=CLOSED_SHELL('',(#176,#177,#178,#179,#180,#181,#182,#183,#184,#185)); 203 | #187=DERIVED_UNIT_ELEMENT(#189,1.); 204 | #188=DERIVED_UNIT_ELEMENT(#331,3.); 205 | #189=( 206 | MASS_UNIT() 207 | NAMED_UNIT(*) 208 | SI_UNIT($,.GRAM.) 209 | ); 210 | #190=DERIVED_UNIT((#187,#188)); 211 | #191=MEASURE_REPRESENTATION_ITEM('density measure', 212 | POSITIVE_RATIO_MEASURE(1.),#190); 213 | #192=PROPERTY_DEFINITION_REPRESENTATION(#197,#194); 214 | #193=PROPERTY_DEFINITION_REPRESENTATION(#198,#195); 215 | #194=REPRESENTATION('material name',(#196),#326); 216 | #195=REPRESENTATION('density',(#191),#326); 217 | #196=DESCRIPTIVE_REPRESENTATION_ITEM('Generic','Generic'); 218 | #197=PROPERTY_DEFINITION('material property','material name',#339); 219 | #198=PROPERTY_DEFINITION('material property','density of part',#339); 220 | #199=AXIS2_PLACEMENT_3D('placement',#272,#218,#219); 221 | #200=AXIS2_PLACEMENT_3D('',#273,#220,#221); 222 | #201=AXIS2_PLACEMENT_3D('',#276,#222,#223); 223 | #202=AXIS2_PLACEMENT_3D('',#277,#224,#225); 224 | #203=AXIS2_PLACEMENT_3D('',#280,#227,#228); 225 | #204=AXIS2_PLACEMENT_3D('',#283,#229,#230); 226 | #205=AXIS2_PLACEMENT_3D('',#284,#231,#232); 227 | #206=AXIS2_PLACEMENT_3D('',#286,#234,#235); 228 | #207=AXIS2_PLACEMENT_3D('',#295,#240,#241); 229 | #208=AXIS2_PLACEMENT_3D('',#301,#245,#246); 230 | #209=AXIS2_PLACEMENT_3D('',#303,#247,#248); 231 | #210=AXIS2_PLACEMENT_3D('',#305,#249,#250); 232 | #211=AXIS2_PLACEMENT_3D('',#307,#252,#253); 233 | #212=AXIS2_PLACEMENT_3D('',#313,#257,#258); 234 | #213=AXIS2_PLACEMENT_3D('',#315,#259,#260); 235 | #214=AXIS2_PLACEMENT_3D('',#317,#261,#262); 236 | #215=AXIS2_PLACEMENT_3D('',#319,#264,#265); 237 | #216=AXIS2_PLACEMENT_3D('',#322,#268,#269); 238 | #217=AXIS2_PLACEMENT_3D('',#323,#270,#271); 239 | #218=DIRECTION('axis',(0.,0.,1.)); 240 | #219=DIRECTION('refdir',(1.,0.,0.)); 241 | #220=DIRECTION('center_axis',(0.,0.,-1.)); 242 | #221=DIRECTION('ref_axis',(1.,0.,0.)); 243 | #222=DIRECTION('center_axis',(0.,0.,1.)); 244 | #223=DIRECTION('ref_axis',(1.,0.,0.)); 245 | #224=DIRECTION('center_axis',(0.,0.,1.)); 246 | #225=DIRECTION('ref_axis',(1.,0.,0.)); 247 | #226=DIRECTION('',(0.857167300702112,1.04972719113862E-16,0.515038074910054)); 248 | #227=DIRECTION('center_axis',(0.,0.,1.)); 249 | #228=DIRECTION('ref_axis',(1.,0.,0.)); 250 | #229=DIRECTION('center_axis',(0.,0.,1.)); 251 | #230=DIRECTION('ref_axis',(1.,0.,0.)); 252 | #231=DIRECTION('center_axis',(0.,0.,1.)); 253 | #232=DIRECTION('ref_axis',(1.,0.,0.)); 254 | #233=DIRECTION('',(0.,0.,1.)); 255 | #234=DIRECTION('center_axis',(0.,-1.,0.)); 256 | #235=DIRECTION('ref_axis',(1.,0.,0.)); 257 | #236=DIRECTION('',(1.,0.,0.)); 258 | #237=DIRECTION('',(0.,0.,1.)); 259 | #238=DIRECTION('',(1.,0.,0.)); 260 | #239=DIRECTION('',(0.,0.,1.)); 261 | #240=DIRECTION('center_axis',(-1.,0.,0.)); 262 | #241=DIRECTION('ref_axis',(0.,-1.,0.)); 263 | #242=DIRECTION('',(0.,-1.,0.)); 264 | #243=DIRECTION('',(0.,-1.,0.)); 265 | #244=DIRECTION('',(0.,0.,1.)); 266 | #245=DIRECTION('center_axis',(0.,0.,1.)); 267 | #246=DIRECTION('ref_axis',(0.,1.,0.)); 268 | #247=DIRECTION('center_axis',(0.,0.,1.)); 269 | #248=DIRECTION('ref_axis',(0.,1.,0.)); 270 | #249=DIRECTION('center_axis',(0.,0.,1.)); 271 | #250=DIRECTION('ref_axis',(0.,1.,0.)); 272 | #251=DIRECTION('',(0.,0.,1.)); 273 | #252=DIRECTION('center_axis',(0.,1.,0.)); 274 | #253=DIRECTION('ref_axis',(-1.,0.,0.)); 275 | #254=DIRECTION('',(-1.,0.,0.)); 276 | #255=DIRECTION('',(-1.,0.,0.)); 277 | #256=DIRECTION('',(0.,0.,1.)); 278 | #257=DIRECTION('center_axis',(0.,0.,1.)); 279 | #258=DIRECTION('ref_axis',(1.,0.,0.)); 280 | #259=DIRECTION('center_axis',(0.,0.,1.)); 281 | #260=DIRECTION('ref_axis',(1.,0.,0.)); 282 | #261=DIRECTION('center_axis',(0.,0.,1.)); 283 | #262=DIRECTION('ref_axis',(1.,0.,0.)); 284 | #263=DIRECTION('',(0.,0.,1.)); 285 | #264=DIRECTION('center_axis',(1.,0.,0.)); 286 | #265=DIRECTION('ref_axis',(0.,1.,0.)); 287 | #266=DIRECTION('',(0.,1.,0.)); 288 | #267=DIRECTION('',(0.,1.,0.)); 289 | #268=DIRECTION('center_axis',(0.,0.,1.)); 290 | #269=DIRECTION('ref_axis',(1.,0.,0.)); 291 | #270=DIRECTION('center_axis',(0.,0.,1.)); 292 | #271=DIRECTION('ref_axis',(1.,0.,0.)); 293 | #272=CARTESIAN_POINT('',(0.,0.,0.)); 294 | #273=CARTESIAN_POINT('Origin',(-1.5,0.5,0.523433564142075)); 295 | #274=CARTESIAN_POINT('',(-1.422,0.5,0.5)); 296 | #275=CARTESIAN_POINT('',(-1.578,0.5,0.5)); 297 | #276=CARTESIAN_POINT('Origin',(-1.5,0.5,0.5)); 298 | #277=CARTESIAN_POINT('Origin',(-1.5,0.5,0.5)); 299 | #278=CARTESIAN_POINT('',(-1.5,0.5,0.54686712828415)); 300 | #279=CARTESIAN_POINT('',(-1.539,0.5,0.523433564142075)); 301 | #280=CARTESIAN_POINT('Origin',(-1.5,0.5,0.25)); 302 | #281=CARTESIAN_POINT('',(-1.422,0.5,0.)); 303 | #282=CARTESIAN_POINT('',(-1.578,0.5,0.)); 304 | #283=CARTESIAN_POINT('Origin',(-1.5,0.5,0.)); 305 | #284=CARTESIAN_POINT('Origin',(-1.5,0.5,0.)); 306 | #285=CARTESIAN_POINT('',(-1.578,0.5,0.25)); 307 | #286=CARTESIAN_POINT('Origin',(-3.,0.,0.)); 308 | #287=CARTESIAN_POINT('',(-3.,0.,0.)); 309 | #288=CARTESIAN_POINT('',(0.,0.,0.)); 310 | #289=CARTESIAN_POINT('',(-3.,0.,0.)); 311 | #290=CARTESIAN_POINT('',(0.,0.,1.)); 312 | #291=CARTESIAN_POINT('',(0.,0.,0.)); 313 | #292=CARTESIAN_POINT('',(-3.,0.,1.)); 314 | #293=CARTESIAN_POINT('',(-3.,0.,1.)); 315 | #294=CARTESIAN_POINT('',(-3.,0.,0.)); 316 | #295=CARTESIAN_POINT('Origin',(-3.,1.,0.)); 317 | #296=CARTESIAN_POINT('',(-3.,1.,0.)); 318 | #297=CARTESIAN_POINT('',(-3.,1.,0.)); 319 | #298=CARTESIAN_POINT('',(-3.,1.,1.)); 320 | #299=CARTESIAN_POINT('',(-3.,1.,1.)); 321 | #300=CARTESIAN_POINT('',(-3.,1.,0.)); 322 | #301=CARTESIAN_POINT('Origin',(-2.,1.,0.)); 323 | #302=CARTESIAN_POINT('',(-2.,2.,0.)); 324 | #303=CARTESIAN_POINT('Origin',(-2.,1.,0.)); 325 | #304=CARTESIAN_POINT('',(-2.,2.,1.)); 326 | #305=CARTESIAN_POINT('Origin',(-2.,1.,1.)); 327 | #306=CARTESIAN_POINT('',(-2.,2.,0.)); 328 | #307=CARTESIAN_POINT('Origin',(-1.,2.,0.)); 329 | #308=CARTESIAN_POINT('',(-1.,2.,0.)); 330 | #309=CARTESIAN_POINT('',(-1.,2.,0.)); 331 | #310=CARTESIAN_POINT('',(-1.,2.,1.)); 332 | #311=CARTESIAN_POINT('',(-1.,2.,1.)); 333 | #312=CARTESIAN_POINT('',(-1.,2.,0.)); 334 | #313=CARTESIAN_POINT('Origin',(-1.,1.,0.)); 335 | #314=CARTESIAN_POINT('',(0.,1.,0.)); 336 | #315=CARTESIAN_POINT('Origin',(-1.,1.,0.)); 337 | #316=CARTESIAN_POINT('',(0.,1.,1.)); 338 | #317=CARTESIAN_POINT('Origin',(-1.,1.,1.)); 339 | #318=CARTESIAN_POINT('',(0.,1.,0.)); 340 | #319=CARTESIAN_POINT('Origin',(0.,0.,0.)); 341 | #320=CARTESIAN_POINT('',(0.,0.,0.)); 342 | #321=CARTESIAN_POINT('',(0.,0.,1.)); 343 | #322=CARTESIAN_POINT('Origin',(-1.5,0.820492542779672,1.)); 344 | #323=CARTESIAN_POINT('Origin',(-1.5,0.820492542779672,0.)); 345 | #324=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 346 | #329,'DISTANCE_ACCURACY_VALUE', 347 | 'Maximum model space distance between geometric entities at asserted c 348 | onnectivities'); 349 | #325=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 350 | #329,'DISTANCE_ACCURACY_VALUE', 351 | 'Maximum model space distance between geometric entities at asserted c 352 | onnectivities'); 353 | #326=( 354 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 355 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#324)) 356 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#329,#334,#333)) 357 | REPRESENTATION_CONTEXT('','3D') 358 | ); 359 | #327=( 360 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 361 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#325)) 362 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#329,#334,#333)) 363 | REPRESENTATION_CONTEXT('','3D') 364 | ); 365 | #328=DIMENSIONAL_EXPONENTS(1.,0.,0.,0.,0.,0.,0.); 366 | #329=( 367 | CONVERSION_BASED_UNIT('inch',#332) 368 | LENGTH_UNIT() 369 | NAMED_UNIT(#328) 370 | ); 371 | #330=( 372 | LENGTH_UNIT() 373 | NAMED_UNIT(*) 374 | SI_UNIT(.MILLI.,.METRE.) 375 | ); 376 | #331=( 377 | LENGTH_UNIT() 378 | NAMED_UNIT(*) 379 | SI_UNIT(.CENTI.,.METRE.) 380 | ); 381 | #332=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#330); 382 | #333=( 383 | NAMED_UNIT(*) 384 | SI_UNIT($,.STERADIAN.) 385 | SOLID_ANGLE_UNIT() 386 | ); 387 | #334=( 388 | NAMED_UNIT(*) 389 | PLANE_ANGLE_UNIT() 390 | SI_UNIT($,.RADIAN.) 391 | ); 392 | #335=SHAPE_DEFINITION_REPRESENTATION(#336,#337); 393 | #336=PRODUCT_DEFINITION_SHAPE('',$,#339); 394 | #337=SHAPE_REPRESENTATION('',(#199),#326); 395 | #338=PRODUCT_DEFINITION_CONTEXT('part definition',#343,'design'); 396 | #339=PRODUCT_DEFINITION('00001_arc_test','00001_arc_test',#340,#338); 397 | #340=PRODUCT_DEFINITION_FORMATION('',$,#345); 398 | #341=PRODUCT_RELATED_PRODUCT_CATEGORY('00001_arc_test','00001_arc_test', 399 | (#345)); 400 | #342=APPLICATION_PROTOCOL_DEFINITION('international standard', 401 | 'automotive_design',2009,#343); 402 | #343=APPLICATION_CONTEXT( 403 | 'Core Data for Automotive Mechanical Design Process'); 404 | #344=PRODUCT_CONTEXT('part definition',#343,'mechanical'); 405 | #345=PRODUCT('00001_arc_test','00001_arc_test',$,(#344)); 406 | #346=PRESENTATION_STYLE_ASSIGNMENT((#347)); 407 | #347=SURFACE_STYLE_USAGE(.BOTH.,#348); 408 | #348=SURFACE_SIDE_STYLE('',(#349)); 409 | #349=SURFACE_STYLE_FILL_AREA(#350); 410 | #350=FILL_AREA_STYLE('',(#351)); 411 | #351=FILL_AREA_STYLE_COLOUR('',#352); 412 | #352=COLOUR_RGB('',0.749019607843137,0.749019607843137,0.749019607843137); 413 | ENDSEC; 414 | END-ISO-10303-21; 415 | -------------------------------------------------------------------------------- /_Tutorial_Notebooks/3DMM Demo.ipt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndrewOriani/PyInventor/064ec6676b43f47874e6c35126bc9ae5762fed9e/_Tutorial_Notebooks/3DMM Demo.ipt -------------------------------------------------------------------------------- /_Tutorial_Notebooks/Cavity Lattice Demo.ipt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndrewOriani/PyInventor/064ec6676b43f47874e6c35126bc9ae5762fed9e/_Tutorial_Notebooks/Cavity Lattice Demo.ipt -------------------------------------------------------------------------------- /_Tutorial_Notebooks/Coax Demo.ipt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndrewOriani/PyInventor/064ec6676b43f47874e6c35126bc9ae5762fed9e/_Tutorial_Notebooks/Coax Demo.ipt -------------------------------------------------------------------------------- /_Tutorial_Notebooks/Coax Demo.stp: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | /* Generated by software containing ST-Developer 4 | * from STEP Tools, Inc. (www.steptools.com) 5 | */ 6 | 7 | FILE_DESCRIPTION( 8 | /* description */ (''), 9 | /* implementation_level */ '2;1'); 10 | 11 | FILE_NAME( 12 | /* name */ 13 | 'S:\\Andrew Oriani\\CQED 3D Resonators\\Quantum Flute Cavities\\Invent 14 | or API\\PyInventor\\_Tutorial_Notebooks\\Coax Demo.stp', 15 | /* time_stamp */ '2020-10-19T00:24:50-05:00', 16 | /* author */ ('oriani'), 17 | /* organization */ (''), 18 | /* preprocessor_version */ 'ST-DEVELOPER v17', 19 | /* originating_system */ 'Autodesk Inventor 2019', 20 | /* authorisation */ ''); 21 | 22 | FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }')); 23 | ENDSEC; 24 | 25 | DATA; 26 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#271); 27 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#281,#12); 28 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#270); 29 | #13=STYLED_ITEM('',(#290),#14); 30 | #14=MANIFOLD_SOLID_BREP('Solid1',#127); 31 | #15=FACE_BOUND('',#37,.T.); 32 | #16=PLANE('',#155); 33 | #17=PLANE('',#159); 34 | #18=PLANE('',#160); 35 | #19=( 36 | BOUNDED_SURFACE() 37 | B_SPLINE_SURFACE(2,2,((#229,#230,#231,#232,#233,#234,#235,#236,#237),(#238, 38 | #239,#240,#241,#242,#243,#244,#245,#246),(#247,#248,#249,#250,#251,#252, 39 | #253,#254,#255)),.UNSPECIFIED.,.F.,.T.,.F.) 40 | B_SPLINE_SURFACE_WITH_KNOTS((3,3),(3,2,2,2,3),(-1.5707963267949,0.),(-3.14159265358979, 41 | -1.5707963267949,0.,1.5707963267949,3.14159265358979),.UNSPECIFIED.) 42 | GEOMETRIC_REPRESENTATION_ITEM() 43 | RATIONAL_B_SPLINE_SURFACE(((1.,0.707106781186548,1.,0.707106781186548,1., 44 | 0.707106781186548,1.,0.707106781186548,1.),(0.707106781186548,0.5,0.707106781186548, 45 | 0.5,0.707106781186548,0.5,0.707106781186548,0.5,0.707106781186548),(1., 46 | 0.707106781186548,1.,0.707106781186548,1.,0.707106781186548,1.,0.707106781186548, 47 | 1.))) 48 | REPRESENTATION_ITEM('') 49 | SURFACE() 50 | ); 51 | #20=TOROIDAL_SURFACE('',#146,0.206,0.094); 52 | #21=FACE_OUTER_BOUND('',#29,.T.); 53 | #22=FACE_OUTER_BOUND('',#30,.T.); 54 | #23=FACE_OUTER_BOUND('',#31,.T.); 55 | #24=FACE_OUTER_BOUND('',#32,.T.); 56 | #25=FACE_OUTER_BOUND('',#33,.T.); 57 | #26=FACE_OUTER_BOUND('',#34,.T.); 58 | #27=FACE_OUTER_BOUND('',#35,.T.); 59 | #28=FACE_OUTER_BOUND('',#36,.T.); 60 | #29=EDGE_LOOP('',(#84,#85,#86,#87,#88,#89)); 61 | #30=EDGE_LOOP('',(#90,#91,#92,#93,#94,#95)); 62 | #31=EDGE_LOOP('',(#96,#97,#98,#99,#100,#101)); 63 | #32=EDGE_LOOP('',(#102,#103,#104,#105,#106)); 64 | #33=EDGE_LOOP('',(#107)); 65 | #34=EDGE_LOOP('',(#108,#109,#110,#111)); 66 | #35=EDGE_LOOP('',(#112)); 67 | #36=EDGE_LOOP('',(#113)); 68 | #37=EDGE_LOOP('',(#114,#115)); 69 | #38=LINE('',#213,#41); 70 | #39=LINE('',#227,#42); 71 | #40=LINE('',#264,#43); 72 | #41=VECTOR('',#169,0.3); 73 | #42=VECTOR('',#186,0.112); 74 | #43=VECTOR('',#199,0.5); 75 | #44=CIRCLE('',#142,0.3); 76 | #45=CIRCLE('',#143,0.3); 77 | #46=CIRCLE('',#144,0.3); 78 | #47=CIRCLE('',#145,0.3); 79 | #48=CIRCLE('',#147,0.094); 80 | #49=CIRCLE('',#148,0.112); 81 | #50=CIRCLE('',#149,0.112); 82 | #51=CIRCLE('',#151,0.112); 83 | #52=CIRCLE('',#152,0.112); 84 | #53=CIRCLE('',#153,0.0495); 85 | #54=CIRCLE('',#154,0.0625); 86 | #55=CIRCLE('',#157,0.5); 87 | #56=CIRCLE('',#158,0.5); 88 | #57=VERTEX_POINT('',#208); 89 | #58=VERTEX_POINT('',#209); 90 | #59=VERTEX_POINT('',#212); 91 | #60=VERTEX_POINT('',#214); 92 | #61=VERTEX_POINT('',#218); 93 | #62=VERTEX_POINT('',#220); 94 | #63=VERTEX_POINT('',#224); 95 | #64=VERTEX_POINT('',#225); 96 | #65=VERTEX_POINT('',#256); 97 | #66=VERTEX_POINT('',#261); 98 | #67=VERTEX_POINT('',#263); 99 | #68=EDGE_CURVE('',#57,#58,#44,.T.); 100 | #69=EDGE_CURVE('',#58,#57,#45,.T.); 101 | #70=EDGE_CURVE('',#58,#59,#38,.T.); 102 | #71=EDGE_CURVE('',#59,#60,#46,.T.); 103 | #72=EDGE_CURVE('',#60,#59,#47,.T.); 104 | #73=EDGE_CURVE('',#60,#61,#48,.T.); 105 | #74=EDGE_CURVE('',#61,#62,#49,.T.); 106 | #75=EDGE_CURVE('',#62,#61,#50,.T.); 107 | #76=EDGE_CURVE('',#63,#64,#51,.T.); 108 | #77=EDGE_CURVE('',#64,#62,#39,.T.); 109 | #78=EDGE_CURVE('',#64,#63,#52,.T.); 110 | #79=EDGE_CURVE('',#65,#65,#53,.T.); 111 | #80=EDGE_CURVE('',#65,#63,#54,.T.); 112 | #81=EDGE_CURVE('',#66,#66,#55,.T.); 113 | #82=EDGE_CURVE('',#66,#67,#40,.T.); 114 | #83=EDGE_CURVE('',#67,#67,#56,.T.); 115 | #84=ORIENTED_EDGE('',*,*,#68,.F.); 116 | #85=ORIENTED_EDGE('',*,*,#69,.F.); 117 | #86=ORIENTED_EDGE('',*,*,#70,.T.); 118 | #87=ORIENTED_EDGE('',*,*,#71,.T.); 119 | #88=ORIENTED_EDGE('',*,*,#72,.T.); 120 | #89=ORIENTED_EDGE('',*,*,#70,.F.); 121 | #90=ORIENTED_EDGE('',*,*,#72,.F.); 122 | #91=ORIENTED_EDGE('',*,*,#73,.T.); 123 | #92=ORIENTED_EDGE('',*,*,#74,.T.); 124 | #93=ORIENTED_EDGE('',*,*,#75,.T.); 125 | #94=ORIENTED_EDGE('',*,*,#73,.F.); 126 | #95=ORIENTED_EDGE('',*,*,#71,.F.); 127 | #96=ORIENTED_EDGE('',*,*,#76,.T.); 128 | #97=ORIENTED_EDGE('',*,*,#77,.T.); 129 | #98=ORIENTED_EDGE('',*,*,#74,.F.); 130 | #99=ORIENTED_EDGE('',*,*,#75,.F.); 131 | #100=ORIENTED_EDGE('',*,*,#77,.F.); 132 | #101=ORIENTED_EDGE('',*,*,#78,.T.); 133 | #102=ORIENTED_EDGE('',*,*,#79,.T.); 134 | #103=ORIENTED_EDGE('',*,*,#80,.T.); 135 | #104=ORIENTED_EDGE('',*,*,#78,.F.); 136 | #105=ORIENTED_EDGE('',*,*,#76,.F.); 137 | #106=ORIENTED_EDGE('',*,*,#80,.F.); 138 | #107=ORIENTED_EDGE('',*,*,#79,.F.); 139 | #108=ORIENTED_EDGE('',*,*,#81,.F.); 140 | #109=ORIENTED_EDGE('',*,*,#82,.T.); 141 | #110=ORIENTED_EDGE('',*,*,#83,.T.); 142 | #111=ORIENTED_EDGE('',*,*,#82,.F.); 143 | #112=ORIENTED_EDGE('',*,*,#81,.T.); 144 | #113=ORIENTED_EDGE('',*,*,#83,.F.); 145 | #114=ORIENTED_EDGE('',*,*,#68,.T.); 146 | #115=ORIENTED_EDGE('',*,*,#69,.T.); 147 | #116=CYLINDRICAL_SURFACE('',#141,0.3); 148 | #117=CYLINDRICAL_SURFACE('',#150,0.112); 149 | #118=CYLINDRICAL_SURFACE('',#156,0.5); 150 | #119=ADVANCED_FACE('',(#21),#116,.F.); 151 | #120=ADVANCED_FACE('',(#22),#20,.F.); 152 | #121=ADVANCED_FACE('',(#23),#117,.T.); 153 | #122=ADVANCED_FACE('',(#24),#19,.F.); 154 | #123=ADVANCED_FACE('',(#25),#16,.F.); 155 | #124=ADVANCED_FACE('',(#26),#118,.T.); 156 | #125=ADVANCED_FACE('',(#27),#17,.F.); 157 | #126=ADVANCED_FACE('',(#28,#15),#18,.T.); 158 | #127=CLOSED_SHELL('',(#119,#120,#121,#122,#123,#124,#125,#126)); 159 | #128=DERIVED_UNIT_ELEMENT(#130,1.); 160 | #129=DERIVED_UNIT_ELEMENT(#275,3.); 161 | #130=( 162 | MASS_UNIT() 163 | NAMED_UNIT(*) 164 | SI_UNIT($,.GRAM.) 165 | ); 166 | #131=DERIVED_UNIT((#128,#129)); 167 | #132=MEASURE_REPRESENTATION_ITEM('density measure', 168 | POSITIVE_RATIO_MEASURE(1.),#131); 169 | #133=PROPERTY_DEFINITION_REPRESENTATION(#138,#135); 170 | #134=PROPERTY_DEFINITION_REPRESENTATION(#139,#136); 171 | #135=REPRESENTATION('material name',(#137),#270); 172 | #136=REPRESENTATION('density',(#132),#270); 173 | #137=DESCRIPTIVE_REPRESENTATION_ITEM('Generic','Generic'); 174 | #138=PROPERTY_DEFINITION('material property','material name',#283); 175 | #139=PROPERTY_DEFINITION('material property','density of part',#283); 176 | #140=AXIS2_PLACEMENT_3D('placement',#206,#161,#162); 177 | #141=AXIS2_PLACEMENT_3D('',#207,#163,#164); 178 | #142=AXIS2_PLACEMENT_3D('',#210,#165,#166); 179 | #143=AXIS2_PLACEMENT_3D('',#211,#167,#168); 180 | #144=AXIS2_PLACEMENT_3D('',#215,#170,#171); 181 | #145=AXIS2_PLACEMENT_3D('',#216,#172,#173); 182 | #146=AXIS2_PLACEMENT_3D('',#217,#174,#175); 183 | #147=AXIS2_PLACEMENT_3D('',#219,#176,#177); 184 | #148=AXIS2_PLACEMENT_3D('',#221,#178,#179); 185 | #149=AXIS2_PLACEMENT_3D('',#222,#180,#181); 186 | #150=AXIS2_PLACEMENT_3D('',#223,#182,#183); 187 | #151=AXIS2_PLACEMENT_3D('',#226,#184,#185); 188 | #152=AXIS2_PLACEMENT_3D('',#228,#187,#188); 189 | #153=AXIS2_PLACEMENT_3D('',#257,#189,#190); 190 | #154=AXIS2_PLACEMENT_3D('',#258,#191,#192); 191 | #155=AXIS2_PLACEMENT_3D('',#259,#193,#194); 192 | #156=AXIS2_PLACEMENT_3D('',#260,#195,#196); 193 | #157=AXIS2_PLACEMENT_3D('',#262,#197,#198); 194 | #158=AXIS2_PLACEMENT_3D('',#265,#200,#201); 195 | #159=AXIS2_PLACEMENT_3D('',#266,#202,#203); 196 | #160=AXIS2_PLACEMENT_3D('',#267,#204,#205); 197 | #161=DIRECTION('axis',(0.,0.,1.)); 198 | #162=DIRECTION('refdir',(1.,0.,0.)); 199 | #163=DIRECTION('center_axis',(0.,0.,-1.)); 200 | #164=DIRECTION('ref_axis',(1.,0.,0.)); 201 | #165=DIRECTION('center_axis',(0.,0.,-1.)); 202 | #166=DIRECTION('ref_axis',(1.,0.,0.)); 203 | #167=DIRECTION('center_axis',(0.,0.,-1.)); 204 | #168=DIRECTION('ref_axis',(1.,0.,0.)); 205 | #169=DIRECTION('',(0.,0.,-1.)); 206 | #170=DIRECTION('center_axis',(0.,0.,-1.)); 207 | #171=DIRECTION('ref_axis',(1.,0.,0.)); 208 | #172=DIRECTION('center_axis',(0.,0.,-1.)); 209 | #173=DIRECTION('ref_axis',(1.,0.,0.)); 210 | #174=DIRECTION('center_axis',(0.,0.,-1.)); 211 | #175=DIRECTION('ref_axis',(-1.,0.,0.)); 212 | #176=DIRECTION('center_axis',(1.22464679914735E-16,1.,0.)); 213 | #177=DIRECTION('ref_axis',(1.,-1.22464679914735E-16,0.)); 214 | #178=DIRECTION('center_axis',(0.,0.,-1.)); 215 | #179=DIRECTION('ref_axis',(1.,0.,0.)); 216 | #180=DIRECTION('center_axis',(0.,0.,-1.)); 217 | #181=DIRECTION('ref_axis',(1.,0.,0.)); 218 | #182=DIRECTION('center_axis',(0.,0.,-1.)); 219 | #183=DIRECTION('ref_axis',(1.,0.,0.)); 220 | #184=DIRECTION('center_axis',(0.,0.,-1.)); 221 | #185=DIRECTION('ref_axis',(1.,0.,0.)); 222 | #186=DIRECTION('',(0.,0.,-1.)); 223 | #187=DIRECTION('center_axis',(0.,0.,-1.)); 224 | #188=DIRECTION('ref_axis',(1.,0.,0.)); 225 | #189=DIRECTION('center_axis',(0.,0.,-1.)); 226 | #190=DIRECTION('ref_axis',(1.,0.,0.)); 227 | #191=DIRECTION('center_axis',(1.22464679914735E-16,1.,0.)); 228 | #192=DIRECTION('ref_axis',(1.,-1.22464679914735E-16,0.)); 229 | #193=DIRECTION('center_axis',(0.,0.,-1.)); 230 | #194=DIRECTION('ref_axis',(-1.,0.,0.)); 231 | #195=DIRECTION('center_axis',(0.,0.,-1.)); 232 | #196=DIRECTION('ref_axis',(-1.,0.,0.)); 233 | #197=DIRECTION('center_axis',(0.,0.,-1.)); 234 | #198=DIRECTION('ref_axis',(-1.,0.,0.)); 235 | #199=DIRECTION('',(0.,0.,1.)); 236 | #200=DIRECTION('center_axis',(0.,0.,-1.)); 237 | #201=DIRECTION('ref_axis',(-1.,0.,0.)); 238 | #202=DIRECTION('center_axis',(0.,0.,1.)); 239 | #203=DIRECTION('ref_axis',(1.,0.,0.)); 240 | #204=DIRECTION('center_axis',(0.,0.,1.)); 241 | #205=DIRECTION('ref_axis',(1.,0.,0.)); 242 | #206=CARTESIAN_POINT('',(0.,0.,0.)); 243 | #207=CARTESIAN_POINT('Origin',(0.,0.,1.075)); 244 | #208=CARTESIAN_POINT('',(0.3,0.,2.)); 245 | #209=CARTESIAN_POINT('',(-0.3,3.67394039744206E-17,2.)); 246 | #210=CARTESIAN_POINT('Origin',(0.,0.,2.)); 247 | #211=CARTESIAN_POINT('Origin',(0.,0.,2.)); 248 | #212=CARTESIAN_POINT('',(-0.3,3.67394039744206E-17,0.15)); 249 | #213=CARTESIAN_POINT('',(-0.3,3.67394039744206E-17,1.075)); 250 | #214=CARTESIAN_POINT('',(0.3,0.,0.15)); 251 | #215=CARTESIAN_POINT('Origin',(0.,0.,0.15)); 252 | #216=CARTESIAN_POINT('Origin',(0.,0.,0.15)); 253 | #217=CARTESIAN_POINT('Origin',(0.,0.,0.15)); 254 | #218=CARTESIAN_POINT('',(0.112,0.,0.15)); 255 | #219=CARTESIAN_POINT('Origin',(0.206,-2.52277240624355E-17,0.15)); 256 | #220=CARTESIAN_POINT('',(-0.112,1.37160441504504E-17,0.15)); 257 | #221=CARTESIAN_POINT('Origin',(0.,0.,0.15)); 258 | #222=CARTESIAN_POINT('Origin',(0.,0.,0.15)); 259 | #223=CARTESIAN_POINT('Origin',(0.,0.,0.2655)); 260 | #224=CARTESIAN_POINT('',(0.112,0.,0.381)); 261 | #225=CARTESIAN_POINT('',(-0.112,1.37160441504504E-17,0.381)); 262 | #226=CARTESIAN_POINT('Origin',(0.,0.,0.381)); 263 | #227=CARTESIAN_POINT('',(-0.112,1.37160441504504E-17,0.2655)); 264 | #228=CARTESIAN_POINT('Origin',(0.,0.,0.381)); 265 | #229=CARTESIAN_POINT('Ctrl Pts',(0.0495,0.,0.4435)); 266 | #230=CARTESIAN_POINT('Ctrl Pts',(0.0495,-0.0495,0.4435)); 267 | #231=CARTESIAN_POINT('Ctrl Pts',(0.,-0.0495,0.4435)); 268 | #232=CARTESIAN_POINT('Ctrl Pts',(-0.0495,-0.0495,0.4435)); 269 | #233=CARTESIAN_POINT('Ctrl Pts',(-0.0495,0.,0.4435)); 270 | #234=CARTESIAN_POINT('Ctrl Pts',(-0.0495,0.0495,0.4435)); 271 | #235=CARTESIAN_POINT('Ctrl Pts',(0.,0.0495,0.4435)); 272 | #236=CARTESIAN_POINT('Ctrl Pts',(0.0495,0.0495,0.4435)); 273 | #237=CARTESIAN_POINT('Ctrl Pts',(0.0495,0.,0.4435)); 274 | #238=CARTESIAN_POINT('Ctrl Pts',(0.112,0.,0.4435)); 275 | #239=CARTESIAN_POINT('Ctrl Pts',(0.112,-0.112,0.4435)); 276 | #240=CARTESIAN_POINT('Ctrl Pts',(0.,-0.112,0.4435)); 277 | #241=CARTESIAN_POINT('Ctrl Pts',(-0.112,-0.112,0.4435)); 278 | #242=CARTESIAN_POINT('Ctrl Pts',(-0.112,0.,0.4435)); 279 | #243=CARTESIAN_POINT('Ctrl Pts',(-0.112,0.112,0.4435)); 280 | #244=CARTESIAN_POINT('Ctrl Pts',(0.,0.112,0.4435)); 281 | #245=CARTESIAN_POINT('Ctrl Pts',(0.112,0.112,0.4435)); 282 | #246=CARTESIAN_POINT('Ctrl Pts',(0.112,0.,0.4435)); 283 | #247=CARTESIAN_POINT('Ctrl Pts',(0.112,0.,0.381)); 284 | #248=CARTESIAN_POINT('Ctrl Pts',(0.112,-0.112,0.381)); 285 | #249=CARTESIAN_POINT('Ctrl Pts',(0.,-0.112,0.381)); 286 | #250=CARTESIAN_POINT('Ctrl Pts',(-0.112,-0.112,0.381)); 287 | #251=CARTESIAN_POINT('Ctrl Pts',(-0.112,0.,0.381)); 288 | #252=CARTESIAN_POINT('Ctrl Pts',(-0.112,0.112,0.381)); 289 | #253=CARTESIAN_POINT('Ctrl Pts',(0.,0.112,0.381)); 290 | #254=CARTESIAN_POINT('Ctrl Pts',(0.112,0.112,0.381)); 291 | #255=CARTESIAN_POINT('Ctrl Pts',(0.112,0.,0.381)); 292 | #256=CARTESIAN_POINT('',(0.0495,0.,0.4435)); 293 | #257=CARTESIAN_POINT('Origin',(0.,0.,0.4435)); 294 | #258=CARTESIAN_POINT('Origin',(0.0495,-6.0620016557794E-18,0.381)); 295 | #259=CARTESIAN_POINT('Origin',(0.,0.,0.4435)); 296 | #260=CARTESIAN_POINT('Origin',(0.,0.,2.)); 297 | #261=CARTESIAN_POINT('',(0.5,6.12323399573677E-17,0.)); 298 | #262=CARTESIAN_POINT('Origin',(0.,0.,0.)); 299 | #263=CARTESIAN_POINT('',(0.5,6.12323399573677E-17,2.)); 300 | #264=CARTESIAN_POINT('',(0.5,-6.12323399573677E-17,2.)); 301 | #265=CARTESIAN_POINT('Origin',(0.,0.,2.)); 302 | #266=CARTESIAN_POINT('Origin',(-5.09920051262407E-17,1.14723275324483E-17, 303 | 0.)); 304 | #267=CARTESIAN_POINT('Origin',(-5.09920051262407E-17,1.14723275324483E-17, 305 | 2.)); 306 | #268=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 307 | #273,'DISTANCE_ACCURACY_VALUE', 308 | 'Maximum model space distance between geometric entities at asserted c 309 | onnectivities'); 310 | #269=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 311 | #273,'DISTANCE_ACCURACY_VALUE', 312 | 'Maximum model space distance between geometric entities at asserted c 313 | onnectivities'); 314 | #270=( 315 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 316 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#268)) 317 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#273,#278,#277)) 318 | REPRESENTATION_CONTEXT('','3D') 319 | ); 320 | #271=( 321 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 322 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#269)) 323 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#273,#278,#277)) 324 | REPRESENTATION_CONTEXT('','3D') 325 | ); 326 | #272=DIMENSIONAL_EXPONENTS(1.,0.,0.,0.,0.,0.,0.); 327 | #273=( 328 | CONVERSION_BASED_UNIT('inch',#276) 329 | LENGTH_UNIT() 330 | NAMED_UNIT(#272) 331 | ); 332 | #274=( 333 | LENGTH_UNIT() 334 | NAMED_UNIT(*) 335 | SI_UNIT(.MILLI.,.METRE.) 336 | ); 337 | #275=( 338 | LENGTH_UNIT() 339 | NAMED_UNIT(*) 340 | SI_UNIT(.CENTI.,.METRE.) 341 | ); 342 | #276=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#274); 343 | #277=( 344 | NAMED_UNIT(*) 345 | SI_UNIT($,.STERADIAN.) 346 | SOLID_ANGLE_UNIT() 347 | ); 348 | #278=( 349 | NAMED_UNIT(*) 350 | PLANE_ANGLE_UNIT() 351 | SI_UNIT($,.RADIAN.) 352 | ); 353 | #279=SHAPE_DEFINITION_REPRESENTATION(#280,#281); 354 | #280=PRODUCT_DEFINITION_SHAPE('',$,#283); 355 | #281=SHAPE_REPRESENTATION('',(#140),#270); 356 | #282=PRODUCT_DEFINITION_CONTEXT('part definition',#287,'design'); 357 | #283=PRODUCT_DEFINITION('Coax Demo','Coax Demo',#284,#282); 358 | #284=PRODUCT_DEFINITION_FORMATION('',$,#289); 359 | #285=PRODUCT_RELATED_PRODUCT_CATEGORY('Coax Demo','Coax Demo',(#289)); 360 | #286=APPLICATION_PROTOCOL_DEFINITION('international standard', 361 | 'automotive_design',2009,#287); 362 | #287=APPLICATION_CONTEXT( 363 | 'Core Data for Automotive Mechanical Design Process'); 364 | #288=PRODUCT_CONTEXT('part definition',#287,'mechanical'); 365 | #289=PRODUCT('Coax Demo','Coax Demo',$,(#288)); 366 | #290=PRESENTATION_STYLE_ASSIGNMENT((#291)); 367 | #291=SURFACE_STYLE_USAGE(.BOTH.,#292); 368 | #292=SURFACE_SIDE_STYLE('',(#293)); 369 | #293=SURFACE_STYLE_FILL_AREA(#294); 370 | #294=FILL_AREA_STYLE('',(#295)); 371 | #295=FILL_AREA_STYLE_COLOUR('',#296); 372 | #296=COLOUR_RGB('',0.749019607843137,0.749019607843137,0.749019607843137); 373 | ENDSEC; 374 | END-ISO-10303-21; 375 | -------------------------------------------------------------------------------- /_Tutorial_Notebooks/Cylindrical Flute Demo.ipt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndrewOriani/PyInventor/064ec6676b43f47874e6c35126bc9ae5762fed9e/_Tutorial_Notebooks/Cylindrical Flute Demo.ipt -------------------------------------------------------------------------------- /_Tutorial_Notebooks/Half Off-Axis Donut Revolve Demo.ipt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndrewOriani/PyInventor/064ec6676b43f47874e6c35126bc9ae5762fed9e/_Tutorial_Notebooks/Half Off-Axis Donut Revolve Demo.ipt -------------------------------------------------------------------------------- /_Tutorial_Notebooks/Half Off-Axis Donut Revolve Demo.stp: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | /* Generated by software containing ST-Developer 4 | * from STEP Tools, Inc. (www.steptools.com) 5 | */ 6 | 7 | FILE_DESCRIPTION( 8 | /* description */ (''), 9 | /* implementation_level */ '2;1'); 10 | 11 | FILE_NAME( 12 | /* name */ 13 | 'S:\\Andrew Oriani\\CQED 3D Resonators\\Quantum Flute Cavities\\Invent 14 | or API\\PyInventor\\_Tutorial_Notebooks\\Half Off-Axis Donut Revolve D 15 | emo.stp', 16 | /* time_stamp */ '2020-10-19T00:24:55-05:00', 17 | /* author */ ('oriani'), 18 | /* organization */ (''), 19 | /* preprocessor_version */ 'ST-DEVELOPER v17', 20 | /* originating_system */ 'Autodesk Inventor 2019', 21 | /* authorisation */ ''); 22 | 23 | FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }')); 24 | ENDSEC; 25 | 26 | DATA; 27 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#107); 28 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#117,#12); 29 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#106); 30 | #13=STYLED_ITEM('',(#126),#14); 31 | #14=MANIFOLD_SOLID_BREP('Solid1',#51); 32 | #15=PLANE('',#71); 33 | #16=PLANE('',#72); 34 | #17=FACE_OUTER_BOUND('',#20,.T.); 35 | #18=FACE_OUTER_BOUND('',#21,.T.); 36 | #19=FACE_OUTER_BOUND('',#22,.T.); 37 | #20=EDGE_LOOP('',(#37,#38,#39,#40,#41,#42)); 38 | #21=EDGE_LOOP('',(#43,#44)); 39 | #22=EDGE_LOOP('',(#45,#46)); 40 | #23=CIRCLE('',#66,0.2); 41 | #24=CIRCLE('',#67,0.2); 42 | #25=CIRCLE('',#68,0.247213595499958); 43 | #26=CIRCLE('',#69,0.2); 44 | #27=CIRCLE('',#70,0.2); 45 | #28=VERTEX_POINT('',#93); 46 | #29=VERTEX_POINT('',#94); 47 | #30=VERTEX_POINT('',#97); 48 | #31=VERTEX_POINT('',#99); 49 | #32=EDGE_CURVE('',#28,#29,#23,.T.); 50 | #33=EDGE_CURVE('',#29,#28,#24,.T.); 51 | #34=EDGE_CURVE('',#29,#30,#25,.T.); 52 | #35=EDGE_CURVE('',#31,#30,#26,.T.); 53 | #36=EDGE_CURVE('',#30,#31,#27,.T.); 54 | #37=ORIENTED_EDGE('',*,*,#32,.F.); 55 | #38=ORIENTED_EDGE('',*,*,#33,.F.); 56 | #39=ORIENTED_EDGE('',*,*,#34,.T.); 57 | #40=ORIENTED_EDGE('',*,*,#35,.F.); 58 | #41=ORIENTED_EDGE('',*,*,#36,.F.); 59 | #42=ORIENTED_EDGE('',*,*,#34,.F.); 60 | #43=ORIENTED_EDGE('',*,*,#35,.T.); 61 | #44=ORIENTED_EDGE('',*,*,#36,.T.); 62 | #45=ORIENTED_EDGE('',*,*,#32,.T.); 63 | #46=ORIENTED_EDGE('',*,*,#33,.T.); 64 | #47=TOROIDAL_SURFACE('',#65,0.447213595499958,0.2); 65 | #48=ADVANCED_FACE('',(#17),#47,.T.); 66 | #49=ADVANCED_FACE('',(#18),#15,.F.); 67 | #50=ADVANCED_FACE('',(#19),#16,.T.); 68 | #51=CLOSED_SHELL('',(#48,#49,#50)); 69 | #52=DERIVED_UNIT_ELEMENT(#54,1.); 70 | #53=DERIVED_UNIT_ELEMENT(#111,3.); 71 | #54=( 72 | MASS_UNIT() 73 | NAMED_UNIT(*) 74 | SI_UNIT($,.GRAM.) 75 | ); 76 | #55=DERIVED_UNIT((#52,#53)); 77 | #56=MEASURE_REPRESENTATION_ITEM('density measure', 78 | POSITIVE_RATIO_MEASURE(1.),#55); 79 | #57=PROPERTY_DEFINITION_REPRESENTATION(#62,#59); 80 | #58=PROPERTY_DEFINITION_REPRESENTATION(#63,#60); 81 | #59=REPRESENTATION('material name',(#61),#106); 82 | #60=REPRESENTATION('density',(#56),#106); 83 | #61=DESCRIPTIVE_REPRESENTATION_ITEM('Generic','Generic'); 84 | #62=PROPERTY_DEFINITION('material property','material name',#119); 85 | #63=PROPERTY_DEFINITION('material property','density of part',#119); 86 | #64=AXIS2_PLACEMENT_3D('placement',#91,#73,#74); 87 | #65=AXIS2_PLACEMENT_3D('',#92,#75,#76); 88 | #66=AXIS2_PLACEMENT_3D('',#95,#77,#78); 89 | #67=AXIS2_PLACEMENT_3D('',#96,#79,#80); 90 | #68=AXIS2_PLACEMENT_3D('',#98,#81,#82); 91 | #69=AXIS2_PLACEMENT_3D('',#100,#83,#84); 92 | #70=AXIS2_PLACEMENT_3D('',#101,#85,#86); 93 | #71=AXIS2_PLACEMENT_3D('',#102,#87,#88); 94 | #72=AXIS2_PLACEMENT_3D('',#103,#89,#90); 95 | #73=DIRECTION('axis',(0.,0.,1.)); 96 | #74=DIRECTION('refdir',(1.,0.,0.)); 97 | #75=DIRECTION('center_axis',(0.447213595499958,0.894427190999916,0.)); 98 | #76=DIRECTION('ref_axis',(0.,0.,1.)); 99 | #77=DIRECTION('center_axis',(1.09535739652841E-16,-5.47678698264202E-17, 100 | -1.)); 101 | #78=DIRECTION('ref_axis',(0.600000000000001,-0.8,1.09535739652841E-16)); 102 | #79=DIRECTION('center_axis',(1.09535739652841E-16,-5.47678698264202E-17, 103 | -1.)); 104 | #80=DIRECTION('ref_axis',(0.600000000000001,-0.8,1.09535739652841E-16)); 105 | #81=DIRECTION('center_axis',(-0.447213595499958,-0.894427190999916,0.)); 106 | #82=DIRECTION('ref_axis',(0.,0.,1.)); 107 | #83=DIRECTION('center_axis',(0.,0.,-1.)); 108 | #84=DIRECTION('ref_axis',(-1.,0.,0.)); 109 | #85=DIRECTION('center_axis',(0.,0.,-1.)); 110 | #86=DIRECTION('ref_axis',(-1.,0.,0.)); 111 | #87=DIRECTION('center_axis',(0.,0.,1.)); 112 | #88=DIRECTION('ref_axis',(1.,0.,0.)); 113 | #89=DIRECTION('center_axis',(1.09535739652841E-16,-5.47678698264202E-17, 114 | -1.)); 115 | #90=DIRECTION('ref_axis',(-0.600000000000001,0.8,-1.09535739652841E-16)); 116 | #91=CARTESIAN_POINT('',(0.,0.,0.)); 117 | #92=CARTESIAN_POINT('Origin',(0.4,0.8,0.)); 118 | #93=CARTESIAN_POINT('',(0.68,0.76,3.28607218958522E-17)); 119 | #94=CARTESIAN_POINT('',(0.621114561800017,0.689442719099992,3.02749338434732E-17)); 120 | #95=CARTESIAN_POINT('Origin',(0.8,0.6,5.47678698264203E-17)); 121 | #96=CARTESIAN_POINT('Origin',(0.8,0.6,5.47678698264203E-17)); 122 | #97=CARTESIAN_POINT('',(0.178885438199983,0.910557280900008,0.)); 123 | #98=CARTESIAN_POINT('Origin',(0.4,0.8,0.)); 124 | #99=CARTESIAN_POINT('',(0.2,1.,0.)); 125 | #100=CARTESIAN_POINT('Origin',(0.,1.,0.)); 126 | #101=CARTESIAN_POINT('Origin',(0.,1.,0.)); 127 | #102=CARTESIAN_POINT('Origin',(-9.21128270635914E-18,1.,0.)); 128 | #103=CARTESIAN_POINT('Origin',(0.8,0.6,5.47678698264203E-17)); 129 | #104=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 130 | #109,'DISTANCE_ACCURACY_VALUE', 131 | 'Maximum model space distance between geometric entities at asserted c 132 | onnectivities'); 133 | #105=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 134 | #109,'DISTANCE_ACCURACY_VALUE', 135 | 'Maximum model space distance between geometric entities at asserted c 136 | onnectivities'); 137 | #106=( 138 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 139 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#104)) 140 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#109,#114,#113)) 141 | REPRESENTATION_CONTEXT('','3D') 142 | ); 143 | #107=( 144 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 145 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#105)) 146 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#109,#114,#113)) 147 | REPRESENTATION_CONTEXT('','3D') 148 | ); 149 | #108=DIMENSIONAL_EXPONENTS(1.,0.,0.,0.,0.,0.,0.); 150 | #109=( 151 | CONVERSION_BASED_UNIT('inch',#112) 152 | LENGTH_UNIT() 153 | NAMED_UNIT(#108) 154 | ); 155 | #110=( 156 | LENGTH_UNIT() 157 | NAMED_UNIT(*) 158 | SI_UNIT(.MILLI.,.METRE.) 159 | ); 160 | #111=( 161 | LENGTH_UNIT() 162 | NAMED_UNIT(*) 163 | SI_UNIT(.CENTI.,.METRE.) 164 | ); 165 | #112=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#110); 166 | #113=( 167 | NAMED_UNIT(*) 168 | SI_UNIT($,.STERADIAN.) 169 | SOLID_ANGLE_UNIT() 170 | ); 171 | #114=( 172 | NAMED_UNIT(*) 173 | PLANE_ANGLE_UNIT() 174 | SI_UNIT($,.RADIAN.) 175 | ); 176 | #115=SHAPE_DEFINITION_REPRESENTATION(#116,#117); 177 | #116=PRODUCT_DEFINITION_SHAPE('',$,#119); 178 | #117=SHAPE_REPRESENTATION('',(#64),#106); 179 | #118=PRODUCT_DEFINITION_CONTEXT('part definition',#123,'design'); 180 | #119=PRODUCT_DEFINITION('Half Off-Axis Donut Revolve Demo', 181 | 'Half Off-Axis Donut Revolve Demo',#120,#118); 182 | #120=PRODUCT_DEFINITION_FORMATION('',$,#125); 183 | #121=PRODUCT_RELATED_PRODUCT_CATEGORY( 184 | 'Half Off-Axis Donut Revolve Demo','Half Off-Axis Donut Revolve Demo',(#125)); 185 | #122=APPLICATION_PROTOCOL_DEFINITION('international standard', 186 | 'automotive_design',2009,#123); 187 | #123=APPLICATION_CONTEXT( 188 | 'Core Data for Automotive Mechanical Design Process'); 189 | #124=PRODUCT_CONTEXT('part definition',#123,'mechanical'); 190 | #125=PRODUCT('Half Off-Axis Donut Revolve Demo', 191 | 'Half Off-Axis Donut Revolve Demo',$,(#124)); 192 | #126=PRESENTATION_STYLE_ASSIGNMENT((#127)); 193 | #127=SURFACE_STYLE_USAGE(.BOTH.,#128); 194 | #128=SURFACE_SIDE_STYLE('',(#129)); 195 | #129=SURFACE_STYLE_FILL_AREA(#130); 196 | #130=FILL_AREA_STYLE('',(#131)); 197 | #131=FILL_AREA_STYLE_COLOUR('',#132); 198 | #132=COLOUR_RGB('',0.749019607843137,0.749019607843137,0.749019607843137); 199 | ENDSEC; 200 | END-ISO-10303-21; 201 | -------------------------------------------------------------------------------- /_Tutorial_Notebooks/Pictures/PyInventor Workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndrewOriani/PyInventor/064ec6676b43f47874e6c35126bc9ae5762fed9e/_Tutorial_Notebooks/Pictures/PyInventor Workflow.png -------------------------------------------------------------------------------- /_Tutorial_Notebooks/arc_test.ipt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndrewOriani/PyInventor/064ec6676b43f47874e6c35126bc9ae5762fed9e/_Tutorial_Notebooks/arc_test.ipt -------------------------------------------------------------------------------- /_Tutorial_Notebooks/arc_test.stp: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | /* Generated by software containing ST-Developer 4 | * from STEP Tools, Inc. (www.steptools.com) 5 | */ 6 | 7 | FILE_DESCRIPTION( 8 | /* description */ (''), 9 | /* implementation_level */ '2;1'); 10 | 11 | FILE_NAME( 12 | /* name */ 13 | 'S:\\Andrew Oriani\\CQED 3D Resonators\\Quantum Flute Cavities\\Invent 14 | or API\\PyInventor\\_Tutorial_Notebooks\\arc_test.stp', 15 | /* time_stamp */ '2020-10-19T00:27:43-05:00', 16 | /* author */ ('oriani'), 17 | /* organization */ (''), 18 | /* preprocessor_version */ 'ST-DEVELOPER v17', 19 | /* originating_system */ 'Autodesk Inventor 2019', 20 | /* authorisation */ ''); 21 | 22 | FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }')); 23 | ENDSEC; 24 | 25 | DATA; 26 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#327); 27 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#337,#12); 28 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#326); 29 | #13=STYLED_ITEM('',(#346),#14); 30 | #14=MANIFOLD_SOLID_BREP('Solid1',#186); 31 | #15=FACE_BOUND('',#45,.T.); 32 | #16=PLANE('',#206); 33 | #17=PLANE('',#207); 34 | #18=PLANE('',#211); 35 | #19=PLANE('',#215); 36 | #20=PLANE('',#216); 37 | #21=PLANE('',#217); 38 | #22=CYLINDRICAL_SURFACE('',#203,0.078); 39 | #23=CYLINDRICAL_SURFACE('',#208,1.); 40 | #24=CYLINDRICAL_SURFACE('',#212,1.); 41 | #25=FACE_OUTER_BOUND('',#35,.T.); 42 | #26=FACE_OUTER_BOUND('',#36,.T.); 43 | #27=FACE_OUTER_BOUND('',#37,.T.); 44 | #28=FACE_OUTER_BOUND('',#38,.T.); 45 | #29=FACE_OUTER_BOUND('',#39,.T.); 46 | #30=FACE_OUTER_BOUND('',#40,.T.); 47 | #31=FACE_OUTER_BOUND('',#41,.T.); 48 | #32=FACE_OUTER_BOUND('',#42,.T.); 49 | #33=FACE_OUTER_BOUND('',#43,.T.); 50 | #34=FACE_OUTER_BOUND('',#44,.T.); 51 | #35=EDGE_LOOP('',(#127,#128,#129,#130)); 52 | #36=EDGE_LOOP('',(#131,#132,#133,#134,#135,#136)); 53 | #37=EDGE_LOOP('',(#137,#138,#139,#140)); 54 | #38=EDGE_LOOP('',(#141,#142,#143,#144)); 55 | #39=EDGE_LOOP('',(#145,#146,#147,#148)); 56 | #40=EDGE_LOOP('',(#149,#150,#151,#152)); 57 | #41=EDGE_LOOP('',(#153,#154,#155,#156)); 58 | #42=EDGE_LOOP('',(#157,#158,#159,#160)); 59 | #43=EDGE_LOOP('',(#161,#162,#163,#164,#165,#166)); 60 | #44=EDGE_LOOP('',(#167,#168,#169,#170,#171,#172)); 61 | #45=EDGE_LOOP('',(#173,#174)); 62 | #46=LINE('',#279,#62); 63 | #47=LINE('',#285,#63); 64 | #48=LINE('',#289,#64); 65 | #49=LINE('',#291,#65); 66 | #50=LINE('',#293,#66); 67 | #51=LINE('',#294,#67); 68 | #52=LINE('',#297,#68); 69 | #53=LINE('',#299,#69); 70 | #54=LINE('',#300,#70); 71 | #55=LINE('',#306,#71); 72 | #56=LINE('',#309,#72); 73 | #57=LINE('',#311,#73); 74 | #58=LINE('',#312,#74); 75 | #59=LINE('',#318,#75); 76 | #60=LINE('',#320,#76); 77 | #61=LINE('',#321,#77); 78 | #62=VECTOR('',#226,0.039); 79 | #63=VECTOR('',#233,0.078); 80 | #64=VECTOR('',#236,0.393700787401575); 81 | #65=VECTOR('',#237,0.393700787401575); 82 | #66=VECTOR('',#238,0.393700787401575); 83 | #67=VECTOR('',#239,0.393700787401575); 84 | #68=VECTOR('',#242,0.393700787401575); 85 | #69=VECTOR('',#243,0.393700787401575); 86 | #70=VECTOR('',#244,0.393700787401575); 87 | #71=VECTOR('',#251,0.393700787401575); 88 | #72=VECTOR('',#254,0.393700787401575); 89 | #73=VECTOR('',#255,0.393700787401575); 90 | #74=VECTOR('',#256,0.393700787401575); 91 | #75=VECTOR('',#263,0.393700787401575); 92 | #76=VECTOR('',#266,0.393700787401575); 93 | #77=VECTOR('',#267,0.393700787401575); 94 | #78=CIRCLE('',#201,0.078); 95 | #79=CIRCLE('',#202,0.078); 96 | #80=CIRCLE('',#204,0.078); 97 | #81=CIRCLE('',#205,0.078); 98 | #82=CIRCLE('',#209,1.); 99 | #83=CIRCLE('',#210,1.); 100 | #84=CIRCLE('',#213,1.); 101 | #85=CIRCLE('',#214,1.); 102 | #86=VERTEX_POINT('',#274); 103 | #87=VERTEX_POINT('',#275); 104 | #88=VERTEX_POINT('',#278); 105 | #89=VERTEX_POINT('',#281); 106 | #90=VERTEX_POINT('',#282); 107 | #91=VERTEX_POINT('',#287); 108 | #92=VERTEX_POINT('',#288); 109 | #93=VERTEX_POINT('',#290); 110 | #94=VERTEX_POINT('',#292); 111 | #95=VERTEX_POINT('',#296); 112 | #96=VERTEX_POINT('',#298); 113 | #97=VERTEX_POINT('',#302); 114 | #98=VERTEX_POINT('',#304); 115 | #99=VERTEX_POINT('',#308); 116 | #100=VERTEX_POINT('',#310); 117 | #101=VERTEX_POINT('',#314); 118 | #102=VERTEX_POINT('',#316); 119 | #103=EDGE_CURVE('',#86,#87,#78,.T.); 120 | #104=EDGE_CURVE('',#87,#86,#79,.T.); 121 | #105=EDGE_CURVE('',#87,#88,#46,.T.); 122 | #106=EDGE_CURVE('',#89,#90,#80,.T.); 123 | #107=EDGE_CURVE('',#90,#89,#81,.T.); 124 | #108=EDGE_CURVE('',#90,#87,#47,.T.); 125 | #109=EDGE_CURVE('',#91,#92,#48,.T.); 126 | #110=EDGE_CURVE('',#92,#93,#49,.T.); 127 | #111=EDGE_CURVE('',#94,#93,#50,.T.); 128 | #112=EDGE_CURVE('',#91,#94,#51,.T.); 129 | #113=EDGE_CURVE('',#95,#91,#52,.T.); 130 | #114=EDGE_CURVE('',#96,#94,#53,.T.); 131 | #115=EDGE_CURVE('',#95,#96,#54,.T.); 132 | #116=EDGE_CURVE('',#97,#95,#82,.T.); 133 | #117=EDGE_CURVE('',#98,#96,#83,.T.); 134 | #118=EDGE_CURVE('',#97,#98,#55,.T.); 135 | #119=EDGE_CURVE('',#99,#97,#56,.T.); 136 | #120=EDGE_CURVE('',#100,#98,#57,.T.); 137 | #121=EDGE_CURVE('',#99,#100,#58,.T.); 138 | #122=EDGE_CURVE('',#101,#99,#84,.T.); 139 | #123=EDGE_CURVE('',#102,#100,#85,.T.); 140 | #124=EDGE_CURVE('',#101,#102,#59,.T.); 141 | #125=EDGE_CURVE('',#92,#101,#60,.T.); 142 | #126=EDGE_CURVE('',#93,#102,#61,.T.); 143 | #127=ORIENTED_EDGE('',*,*,#103,.F.); 144 | #128=ORIENTED_EDGE('',*,*,#104,.F.); 145 | #129=ORIENTED_EDGE('',*,*,#105,.T.); 146 | #130=ORIENTED_EDGE('',*,*,#105,.F.); 147 | #131=ORIENTED_EDGE('',*,*,#106,.F.); 148 | #132=ORIENTED_EDGE('',*,*,#107,.F.); 149 | #133=ORIENTED_EDGE('',*,*,#108,.T.); 150 | #134=ORIENTED_EDGE('',*,*,#104,.T.); 151 | #135=ORIENTED_EDGE('',*,*,#103,.T.); 152 | #136=ORIENTED_EDGE('',*,*,#108,.F.); 153 | #137=ORIENTED_EDGE('',*,*,#109,.T.); 154 | #138=ORIENTED_EDGE('',*,*,#110,.T.); 155 | #139=ORIENTED_EDGE('',*,*,#111,.F.); 156 | #140=ORIENTED_EDGE('',*,*,#112,.F.); 157 | #141=ORIENTED_EDGE('',*,*,#113,.T.); 158 | #142=ORIENTED_EDGE('',*,*,#112,.T.); 159 | #143=ORIENTED_EDGE('',*,*,#114,.F.); 160 | #144=ORIENTED_EDGE('',*,*,#115,.F.); 161 | #145=ORIENTED_EDGE('',*,*,#116,.T.); 162 | #146=ORIENTED_EDGE('',*,*,#115,.T.); 163 | #147=ORIENTED_EDGE('',*,*,#117,.F.); 164 | #148=ORIENTED_EDGE('',*,*,#118,.F.); 165 | #149=ORIENTED_EDGE('',*,*,#119,.T.); 166 | #150=ORIENTED_EDGE('',*,*,#118,.T.); 167 | #151=ORIENTED_EDGE('',*,*,#120,.F.); 168 | #152=ORIENTED_EDGE('',*,*,#121,.F.); 169 | #153=ORIENTED_EDGE('',*,*,#122,.T.); 170 | #154=ORIENTED_EDGE('',*,*,#121,.T.); 171 | #155=ORIENTED_EDGE('',*,*,#123,.F.); 172 | #156=ORIENTED_EDGE('',*,*,#124,.F.); 173 | #157=ORIENTED_EDGE('',*,*,#125,.T.); 174 | #158=ORIENTED_EDGE('',*,*,#124,.T.); 175 | #159=ORIENTED_EDGE('',*,*,#126,.F.); 176 | #160=ORIENTED_EDGE('',*,*,#110,.F.); 177 | #161=ORIENTED_EDGE('',*,*,#126,.T.); 178 | #162=ORIENTED_EDGE('',*,*,#123,.T.); 179 | #163=ORIENTED_EDGE('',*,*,#120,.T.); 180 | #164=ORIENTED_EDGE('',*,*,#117,.T.); 181 | #165=ORIENTED_EDGE('',*,*,#114,.T.); 182 | #166=ORIENTED_EDGE('',*,*,#111,.T.); 183 | #167=ORIENTED_EDGE('',*,*,#125,.F.); 184 | #168=ORIENTED_EDGE('',*,*,#109,.F.); 185 | #169=ORIENTED_EDGE('',*,*,#113,.F.); 186 | #170=ORIENTED_EDGE('',*,*,#116,.F.); 187 | #171=ORIENTED_EDGE('',*,*,#119,.F.); 188 | #172=ORIENTED_EDGE('',*,*,#122,.F.); 189 | #173=ORIENTED_EDGE('',*,*,#106,.T.); 190 | #174=ORIENTED_EDGE('',*,*,#107,.T.); 191 | #175=CONICAL_SURFACE('',#200,0.039,1.02974425867665); 192 | #176=ADVANCED_FACE('',(#25),#175,.F.); 193 | #177=ADVANCED_FACE('',(#26),#22,.F.); 194 | #178=ADVANCED_FACE('',(#27),#16,.T.); 195 | #179=ADVANCED_FACE('',(#28),#17,.T.); 196 | #180=ADVANCED_FACE('',(#29),#23,.T.); 197 | #181=ADVANCED_FACE('',(#30),#18,.T.); 198 | #182=ADVANCED_FACE('',(#31),#24,.T.); 199 | #183=ADVANCED_FACE('',(#32),#19,.T.); 200 | #184=ADVANCED_FACE('',(#33),#20,.T.); 201 | #185=ADVANCED_FACE('',(#34,#15),#21,.F.); 202 | #186=CLOSED_SHELL('',(#176,#177,#178,#179,#180,#181,#182,#183,#184,#185)); 203 | #187=DERIVED_UNIT_ELEMENT(#189,1.); 204 | #188=DERIVED_UNIT_ELEMENT(#331,3.); 205 | #189=( 206 | MASS_UNIT() 207 | NAMED_UNIT(*) 208 | SI_UNIT($,.GRAM.) 209 | ); 210 | #190=DERIVED_UNIT((#187,#188)); 211 | #191=MEASURE_REPRESENTATION_ITEM('density measure', 212 | POSITIVE_RATIO_MEASURE(1.),#190); 213 | #192=PROPERTY_DEFINITION_REPRESENTATION(#197,#194); 214 | #193=PROPERTY_DEFINITION_REPRESENTATION(#198,#195); 215 | #194=REPRESENTATION('material name',(#196),#326); 216 | #195=REPRESENTATION('density',(#191),#326); 217 | #196=DESCRIPTIVE_REPRESENTATION_ITEM('Generic','Generic'); 218 | #197=PROPERTY_DEFINITION('material property','material name',#339); 219 | #198=PROPERTY_DEFINITION('material property','density of part',#339); 220 | #199=AXIS2_PLACEMENT_3D('placement',#272,#218,#219); 221 | #200=AXIS2_PLACEMENT_3D('',#273,#220,#221); 222 | #201=AXIS2_PLACEMENT_3D('',#276,#222,#223); 223 | #202=AXIS2_PLACEMENT_3D('',#277,#224,#225); 224 | #203=AXIS2_PLACEMENT_3D('',#280,#227,#228); 225 | #204=AXIS2_PLACEMENT_3D('',#283,#229,#230); 226 | #205=AXIS2_PLACEMENT_3D('',#284,#231,#232); 227 | #206=AXIS2_PLACEMENT_3D('',#286,#234,#235); 228 | #207=AXIS2_PLACEMENT_3D('',#295,#240,#241); 229 | #208=AXIS2_PLACEMENT_3D('',#301,#245,#246); 230 | #209=AXIS2_PLACEMENT_3D('',#303,#247,#248); 231 | #210=AXIS2_PLACEMENT_3D('',#305,#249,#250); 232 | #211=AXIS2_PLACEMENT_3D('',#307,#252,#253); 233 | #212=AXIS2_PLACEMENT_3D('',#313,#257,#258); 234 | #213=AXIS2_PLACEMENT_3D('',#315,#259,#260); 235 | #214=AXIS2_PLACEMENT_3D('',#317,#261,#262); 236 | #215=AXIS2_PLACEMENT_3D('',#319,#264,#265); 237 | #216=AXIS2_PLACEMENT_3D('',#322,#268,#269); 238 | #217=AXIS2_PLACEMENT_3D('',#323,#270,#271); 239 | #218=DIRECTION('axis',(0.,0.,1.)); 240 | #219=DIRECTION('refdir',(1.,0.,0.)); 241 | #220=DIRECTION('center_axis',(0.,0.,-1.)); 242 | #221=DIRECTION('ref_axis',(1.,0.,0.)); 243 | #222=DIRECTION('center_axis',(0.,0.,1.)); 244 | #223=DIRECTION('ref_axis',(1.,0.,0.)); 245 | #224=DIRECTION('center_axis',(0.,0.,1.)); 246 | #225=DIRECTION('ref_axis',(1.,0.,0.)); 247 | #226=DIRECTION('',(0.857167300702112,1.04972719113862E-16,0.515038074910054)); 248 | #227=DIRECTION('center_axis',(0.,0.,1.)); 249 | #228=DIRECTION('ref_axis',(1.,0.,0.)); 250 | #229=DIRECTION('center_axis',(0.,0.,1.)); 251 | #230=DIRECTION('ref_axis',(1.,0.,0.)); 252 | #231=DIRECTION('center_axis',(0.,0.,1.)); 253 | #232=DIRECTION('ref_axis',(1.,0.,0.)); 254 | #233=DIRECTION('',(0.,0.,1.)); 255 | #234=DIRECTION('center_axis',(0.,-1.,0.)); 256 | #235=DIRECTION('ref_axis',(1.,0.,0.)); 257 | #236=DIRECTION('',(1.,0.,0.)); 258 | #237=DIRECTION('',(0.,0.,1.)); 259 | #238=DIRECTION('',(1.,0.,0.)); 260 | #239=DIRECTION('',(0.,0.,1.)); 261 | #240=DIRECTION('center_axis',(-1.,0.,0.)); 262 | #241=DIRECTION('ref_axis',(0.,-1.,0.)); 263 | #242=DIRECTION('',(0.,-1.,0.)); 264 | #243=DIRECTION('',(0.,-1.,0.)); 265 | #244=DIRECTION('',(0.,0.,1.)); 266 | #245=DIRECTION('center_axis',(0.,0.,1.)); 267 | #246=DIRECTION('ref_axis',(0.,1.,0.)); 268 | #247=DIRECTION('center_axis',(0.,0.,1.)); 269 | #248=DIRECTION('ref_axis',(0.,1.,0.)); 270 | #249=DIRECTION('center_axis',(0.,0.,1.)); 271 | #250=DIRECTION('ref_axis',(0.,1.,0.)); 272 | #251=DIRECTION('',(0.,0.,1.)); 273 | #252=DIRECTION('center_axis',(0.,1.,0.)); 274 | #253=DIRECTION('ref_axis',(-1.,0.,0.)); 275 | #254=DIRECTION('',(-1.,0.,0.)); 276 | #255=DIRECTION('',(-1.,0.,0.)); 277 | #256=DIRECTION('',(0.,0.,1.)); 278 | #257=DIRECTION('center_axis',(0.,0.,1.)); 279 | #258=DIRECTION('ref_axis',(1.,0.,0.)); 280 | #259=DIRECTION('center_axis',(0.,0.,1.)); 281 | #260=DIRECTION('ref_axis',(1.,0.,0.)); 282 | #261=DIRECTION('center_axis',(0.,0.,1.)); 283 | #262=DIRECTION('ref_axis',(1.,0.,0.)); 284 | #263=DIRECTION('',(0.,0.,1.)); 285 | #264=DIRECTION('center_axis',(1.,0.,0.)); 286 | #265=DIRECTION('ref_axis',(0.,1.,0.)); 287 | #266=DIRECTION('',(0.,1.,0.)); 288 | #267=DIRECTION('',(0.,1.,0.)); 289 | #268=DIRECTION('center_axis',(0.,0.,1.)); 290 | #269=DIRECTION('ref_axis',(1.,0.,0.)); 291 | #270=DIRECTION('center_axis',(0.,0.,1.)); 292 | #271=DIRECTION('ref_axis',(1.,0.,0.)); 293 | #272=CARTESIAN_POINT('',(0.,0.,0.)); 294 | #273=CARTESIAN_POINT('Origin',(-1.5,0.5,0.523433564142075)); 295 | #274=CARTESIAN_POINT('',(-1.422,0.5,0.5)); 296 | #275=CARTESIAN_POINT('',(-1.578,0.5,0.5)); 297 | #276=CARTESIAN_POINT('Origin',(-1.5,0.5,0.5)); 298 | #277=CARTESIAN_POINT('Origin',(-1.5,0.5,0.5)); 299 | #278=CARTESIAN_POINT('',(-1.5,0.5,0.54686712828415)); 300 | #279=CARTESIAN_POINT('',(-1.539,0.5,0.523433564142075)); 301 | #280=CARTESIAN_POINT('Origin',(-1.5,0.5,0.25)); 302 | #281=CARTESIAN_POINT('',(-1.422,0.5,0.)); 303 | #282=CARTESIAN_POINT('',(-1.578,0.5,0.)); 304 | #283=CARTESIAN_POINT('Origin',(-1.5,0.5,0.)); 305 | #284=CARTESIAN_POINT('Origin',(-1.5,0.5,0.)); 306 | #285=CARTESIAN_POINT('',(-1.578,0.5,0.25)); 307 | #286=CARTESIAN_POINT('Origin',(-3.,0.,0.)); 308 | #287=CARTESIAN_POINT('',(-3.,0.,0.)); 309 | #288=CARTESIAN_POINT('',(0.,0.,0.)); 310 | #289=CARTESIAN_POINT('',(-3.,0.,0.)); 311 | #290=CARTESIAN_POINT('',(0.,0.,1.)); 312 | #291=CARTESIAN_POINT('',(0.,0.,0.)); 313 | #292=CARTESIAN_POINT('',(-3.,0.,1.)); 314 | #293=CARTESIAN_POINT('',(-3.,0.,1.)); 315 | #294=CARTESIAN_POINT('',(-3.,0.,0.)); 316 | #295=CARTESIAN_POINT('Origin',(-3.,1.,0.)); 317 | #296=CARTESIAN_POINT('',(-3.,1.,0.)); 318 | #297=CARTESIAN_POINT('',(-3.,1.,0.)); 319 | #298=CARTESIAN_POINT('',(-3.,1.,1.)); 320 | #299=CARTESIAN_POINT('',(-3.,1.,1.)); 321 | #300=CARTESIAN_POINT('',(-3.,1.,0.)); 322 | #301=CARTESIAN_POINT('Origin',(-2.,1.,0.)); 323 | #302=CARTESIAN_POINT('',(-2.,2.,0.)); 324 | #303=CARTESIAN_POINT('Origin',(-2.,1.,0.)); 325 | #304=CARTESIAN_POINT('',(-2.,2.,1.)); 326 | #305=CARTESIAN_POINT('Origin',(-2.,1.,1.)); 327 | #306=CARTESIAN_POINT('',(-2.,2.,0.)); 328 | #307=CARTESIAN_POINT('Origin',(-1.,2.,0.)); 329 | #308=CARTESIAN_POINT('',(-1.,2.,0.)); 330 | #309=CARTESIAN_POINT('',(-1.,2.,0.)); 331 | #310=CARTESIAN_POINT('',(-1.,2.,1.)); 332 | #311=CARTESIAN_POINT('',(-1.,2.,1.)); 333 | #312=CARTESIAN_POINT('',(-1.,2.,0.)); 334 | #313=CARTESIAN_POINT('Origin',(-1.,1.,0.)); 335 | #314=CARTESIAN_POINT('',(0.,1.,0.)); 336 | #315=CARTESIAN_POINT('Origin',(-1.,1.,0.)); 337 | #316=CARTESIAN_POINT('',(0.,1.,1.)); 338 | #317=CARTESIAN_POINT('Origin',(-1.,1.,1.)); 339 | #318=CARTESIAN_POINT('',(0.,1.,0.)); 340 | #319=CARTESIAN_POINT('Origin',(0.,0.,0.)); 341 | #320=CARTESIAN_POINT('',(0.,0.,0.)); 342 | #321=CARTESIAN_POINT('',(0.,0.,1.)); 343 | #322=CARTESIAN_POINT('Origin',(-1.5,0.820492542779672,1.)); 344 | #323=CARTESIAN_POINT('Origin',(-1.5,0.820492542779672,0.)); 345 | #324=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 346 | #329,'DISTANCE_ACCURACY_VALUE', 347 | 'Maximum model space distance between geometric entities at asserted c 348 | onnectivities'); 349 | #325=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000393700787401575), 350 | #329,'DISTANCE_ACCURACY_VALUE', 351 | 'Maximum model space distance between geometric entities at asserted c 352 | onnectivities'); 353 | #326=( 354 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 355 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#324)) 356 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#329,#334,#333)) 357 | REPRESENTATION_CONTEXT('','3D') 358 | ); 359 | #327=( 360 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 361 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#325)) 362 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#329,#334,#333)) 363 | REPRESENTATION_CONTEXT('','3D') 364 | ); 365 | #328=DIMENSIONAL_EXPONENTS(1.,0.,0.,0.,0.,0.,0.); 366 | #329=( 367 | CONVERSION_BASED_UNIT('inch',#332) 368 | LENGTH_UNIT() 369 | NAMED_UNIT(#328) 370 | ); 371 | #330=( 372 | LENGTH_UNIT() 373 | NAMED_UNIT(*) 374 | SI_UNIT(.MILLI.,.METRE.) 375 | ); 376 | #331=( 377 | LENGTH_UNIT() 378 | NAMED_UNIT(*) 379 | SI_UNIT(.CENTI.,.METRE.) 380 | ); 381 | #332=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#330); 382 | #333=( 383 | NAMED_UNIT(*) 384 | SI_UNIT($,.STERADIAN.) 385 | SOLID_ANGLE_UNIT() 386 | ); 387 | #334=( 388 | NAMED_UNIT(*) 389 | PLANE_ANGLE_UNIT() 390 | SI_UNIT($,.RADIAN.) 391 | ); 392 | #335=SHAPE_DEFINITION_REPRESENTATION(#336,#337); 393 | #336=PRODUCT_DEFINITION_SHAPE('',$,#339); 394 | #337=SHAPE_REPRESENTATION('',(#199),#326); 395 | #338=PRODUCT_DEFINITION_CONTEXT('part definition',#343,'design'); 396 | #339=PRODUCT_DEFINITION('arc_test','arc_test',#340,#338); 397 | #340=PRODUCT_DEFINITION_FORMATION('',$,#345); 398 | #341=PRODUCT_RELATED_PRODUCT_CATEGORY('arc_test','arc_test',(#345)); 399 | #342=APPLICATION_PROTOCOL_DEFINITION('international standard', 400 | 'automotive_design',2009,#343); 401 | #343=APPLICATION_CONTEXT( 402 | 'Core Data for Automotive Mechanical Design Process'); 403 | #344=PRODUCT_CONTEXT('part definition',#343,'mechanical'); 404 | #345=PRODUCT('arc_test','arc_test',$,(#344)); 405 | #346=PRESENTATION_STYLE_ASSIGNMENT((#347)); 406 | #347=SURFACE_STYLE_USAGE(.BOTH.,#348); 407 | #348=SURFACE_SIDE_STYLE('',(#349)); 408 | #349=SURFACE_STYLE_FILL_AREA(#350); 409 | #350=FILL_AREA_STYLE('',(#351)); 410 | #351=FILL_AREA_STYLE_COLOUR('',#352); 411 | #352=COLOUR_RGB('',0.749019607843137,0.749019607843137,0.749019607843137); 412 | ENDSEC; 413 | END-ISO-10303-21; 414 | -------------------------------------------------------------------------------- /_Tutorial_Notebooks/lockfile.lck: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | attrdict>=1.8.0 2 | numpy>=1.15.0 3 | ipython>=7.0.0 4 | xlwings>=0.19.5 5 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Welcome to PyInventor! This is a Python wrapper for the Autodesk Inventor API 3 | which is natively written in VBA. This package ONLY works on windows machines 4 | (or MacOS running windows in bootcamp) and will work on Inventor 2017 or later 5 | (although it is most thoroughly tested on Inventor 2019, which is recommended). 6 | This package requires no dependencies outside of Python 3 through the Anaconda 7 | distribution. This package can only create 3D parts (no assemblies) and still 8 | lacks some of the 3D functionality (no lofts, 3D sketches, or chamfers, among 9 | others). To see the full functionality check the demos in the _Tutorial_Notebook 10 | folder. Have fun and shoot me an email with questions: 11 | 12 | ~Andrew Oriani 13 | 14 | ''' 15 | 16 | from pathlib import Path 17 | from setuptools import setup, find_packages 18 | 19 | here = Path(__file__).parent.absolute() 20 | 21 | # Get the long description from the README file 22 | with open(here / "README.md", encoding="utf-8") as f: 23 | long_description = f.read() 24 | 25 | with open(here / "requirements.txt", encoding="utf-8") as f: 26 | requirements = f.read().splitlines() 27 | 28 | doclines = __doc__.split('\n') 29 | 30 | setup(name='PyInventor', 31 | version='0.4', 32 | description = doclines[0], 33 | long_description=long_description, 34 | long_description_content_type="text/markdown", 35 | author='Andrew E. Oriani', 36 | packages=find_packages(), 37 | author_email='oriani@uchicago.edu', 38 | maintainer='Andrew Oriani SchusterLab', 39 | license='BSD-3-Clause', 40 | classifiers=[ 41 | "Intended Audience :: Developers", 42 | "Intended Audience :: Science/Research", 43 | "Operating System :: Microsoft :: Windows::Only", 44 | "Programming Language :: Python :: 3 :: Only", 45 | "Programming Language :: Python :: 3.5", 46 | "Programming Language :: Python :: 3.6", 47 | "Programming Language :: Python :: 3.7", 48 | "Programming Language :: Python :: 3.8", 49 | "Topic :: Scientific/Engineering", 50 | "Environment :: Console"], 51 | python_requires=">=3.5, <4", 52 | # install_requires=['numpy', 'IPython'], 53 | install_requires=requirements 54 | ) 55 | --------------------------------------------------------------------------------