| 451 | Podobno kot pri komercialno dostopnih modelirnikih, lahko obstoječo geometrijo naknadno preoblikujemo z uporabo apliciranih značilk. Glavna lastnost apliciranih značilk je, da ne morejo obstajati kot samostojni predmet, ampak rabijo neko predhodno zmodelirano 3D geometrijo, ki jo nato spremenimo. Poznamo mnogo različnih apliciranih značilk. Nekatere izmed njih bomo razložili v tem poglavju. |
| 452 | [[BR]][[BR]] |
| 453 | |
| 454 | === Izdelava zaokrožitev (Fillet) === |
| 455 | Poznamo dve vrsti zaokrožitve; zaokrožitev s konstantnim radiem zaokrožitve ter zaokrožitev s sprejemljivim radiem zaokrožitve. |
| 456 | Knjižnica ukazov za izdelavo zaokrožitev se nahaja v viru BRepFilletAPI in jo je potrebno vključiti v program pred uporabo ukaza: |
| 457 | {{{ |
| 458 | #!python |
| 459 | from OCC.TopExp import* |
| 460 | from OCC.BRepFilletAPI import * |
| 461 | from OCC.Utils.Topology import * |
| 462 | }}} |
| 463 | Pri apliciranju vseh vrst zaokrožitev je potrebno imeti podatek o robu oziroma točki kamor hočemo izvesti zaokrožitev ter o parametrih zaokrožitve (radij zaokrožitve). |
| 464 | |
| 465 | ==== Zaokrožitev s konstantnim radiem zaokrožitve ==== |
| 466 | Prvi korak je izbira objekta, na katerem se izvede zaokrožitev: |
| 467 | {{{ |
| 468 | #!python |
| 469 | zaokrozitev = BRepFilletAPI_MakeFillet(Oblika) |
| 470 | }}} |
| 471 | Sledi izbira robov ter parametrov zaokrožitve. Primer, ko izvedemo zaokrožitev na vseh robovih elementa: |
| 472 | {{{ |
| 473 | #!python |
| 474 | topology_traverser = Topo(Oblika) |
| 475 | for aEdge in topology_traverser.edges(): |
| 476 | zaokrozitev.Add(Radij , aEdge) |
| 477 | # zaokrozitev.Add(Radij_1, Radij_2 , aEdge) |
| 478 | }}} |
| 479 | Za izbiro točno določenih robov, na katerih hočemo izvesti zakrožitve, je potrebno vpeljati različne geometrijske teste. Primer, ko hočemo zakrožiti zgolj vertikalne robove kocke. Vpeljemo preprosti test, ki nam pove, če točki robova ležita na isti ravnini (X,Y). |
| 480 | {{{ |
| 481 | #!python |
| 482 | for aEdge in topology_traverser.edges(): |
| 483 | first, last = TopExp().FirstVertex(aEdge), TopExp().LastVertex(aEdge) |
| 484 | first_vert, last_vert = BRep_Tool().Pnt(first), BRep_Tool().Pnt(last) |
| 485 | if first_vert.Z() != last_vert.Z(): |
| 486 | zaokrozitev.Add(Radij, aEdge) |
| 487 | }}} |
| 488 | Pri izdelavi zaokrožitev moramo biti pozorni na velikost zaokrožitve. Vrednost zaokrožitve mora biti dovolj majhna da lahko normalno zaokrožimo robove. |
| 489 | |
| 490 | ==== Zaokrožitev z variabilnim radiem zaokrožitve ==== |
| 491 | Za apliciranje variabilnega radija zaokrožitve na modelu je potrebno razdeliti izbrani rob na intervale ter nato določiti radij zaokrožitve na določenem intervalu. Primer razdelitve robu na 6 intervalov ter določitev parametrov: |
| 492 | {{{ |
| 493 | #!python |
| 494 | TabPoint = TColgp_Array1OfPnt2d(1,6) |
| 495 | P1 = gp_Pnt2d(0.,8.) |
| 496 | P2 = gp_Pnt2d(0.2,16.) |
| 497 | P3 = gp_Pnt2d(0.4,25.) |
| 498 | P4 = gp_Pnt2d(0.6,55.) |
| 499 | P5 = gp_Pnt2d(0.8,28.) |
| 500 | P6 = gp_Pnt2d(1.,20.) |
| 501 | TabPoint.SetValue(1,P1) |
| 502 | TabPoint.SetValue(2,P2) |
| 503 | TabPoint.SetValue(3,P3) |
| 504 | TabPoint.SetValue(4,P4) |
| 505 | TabPoint.SetValue(5,P5) |
| 506 | TabPoint.SetValue(6,P6) |
| 507 | }}} |
| 508 | Določitev izbranega robu na katerem izvedemo ukaz poteka: |
| 509 | {{{ |
| 510 | #!python |
| 511 | exp = TopExp_Explorer(Oblika,TopAbs_EDGE) |
| 512 | exp.Next() |
| 513 | exp.Next() |
| 514 | exp.Next() |
| 515 | exp.Next() |
| 516 | }}} |
| 517 | |
| 518 | ==== Zaokrožitev okoli točke ==== |
| 519 | Zaokrožitev lahko izvedemo tudi okoli točke. V tem primeru je potrebno najprej izbrati točko, okoli katere hočemo izvesti zaokrožitev. Nato določimo vse robove, ki imajo začetno ali končno vozlišče v izbrani točki, ter izvedemo zaokrožitev na teh robovih. To lahko naredimo z uvedbo nove funkcije: |
| 520 | {{{ |
| 521 | #!python |
| 522 | def vertex_fillet(oblika, tocka): |
| 523 | afillet = BRepFilletAPI_MakeFillet(oblika) |
| 524 | cnt = 0 |
| 525 | for edg in topo.edges_from_vertex(tocka): |
| 526 | first, last = TopExp().FirstVertex(edg), TopExp().LastVertex(edg) |
| 527 | vertex, first_vert, last_vert = BRep_Tool().Pnt(tocka), BRep_Tool().Pnt(first), BRep_Tool().Pnt(last) |
| 528 | if edg.Orientation(): |
| 529 | if not vertex.IsEqual(first_vert, 0.001): |
| 530 | afillet.Add(Radij_1, Radij_2, Rob) |
| 531 | else: |
| 532 | afillet.Add(Radij_1, Radij_2, Rob) |
| 533 | cnt+=1 |
| 534 | afillet.Build() |
| 535 | if afillet.IsDone(): |
| 536 | return afillet.Shape() |
| 537 | |
| 538 | #izvedba zaokrozitve okoli tocke |
| 539 | zaokrozitev_tocka = vertex_fillet(oblika,tocka1) |
| 540 | }}} |
| 541 | |
| 542 | === Izdelava posnetij (Chamfer) === |
| 543 | |
| 544 | === Izdelava lupine (Shell) === |
| 545 | |
| 546 | === Izdelava odmika (OffsetShape) === |
| 547 | |
| 548 | === Izdelava kota nagiba (Draft_Angle) === |
| 549 | |
| 550 | === Izdelava rebra (MakeLinerForm) === |