| 427 | === Primer: Zaokroževanje robov (ang. fillet) === |
| 428 | |
| 429 | |
| 430 | V nadaljevanju je prikazan način za zaokrožitev vseh robov na primeru kocke. |
| 431 | Celotna koda je na voljo tudi [http://trac.lecad.si/vaje/browser/python/SHAPER/fillets/makeFillet.py tukaj]. |
| 432 | |
| 433 | [[Image(SHAPER_example_makeFillet.png,right,300px)]] |
| 434 | |
| 435 | {{{ |
| 436 | #!python |
| 437 | |
| 438 | """ |
| 439 | SALOME SHAPER modul: |
| 440 | Primer izdelave zaokrožitve vseh robov na primeru kocke. |
| 441 | """ |
| 442 | |
| 443 | from salome.shaper import model |
| 444 | from GeomAPI import * |
| 445 | |
| 446 | # Kreiranje SHAPER session-a |
| 447 | model.begin() |
| 448 | # Kreiranje objekta: t.i. "dokument", ki predstavlja temelje aplikacije |
| 449 | # (root document of SHAPER) |
| 450 | partSet = model.moduleDocument() |
| 451 | # Dodajanje part-a v model |
| 452 | moj_part = model.addPart(partSet) |
| 453 | # Kreiranje objekta za dostop do pod-dokumenta, ki se nanaša na part |
| 454 | part_dokument = moj_part.document() |
| 455 | # Dodajanje kocke |
| 456 | kocka = model.addBox(part_dokument, 10, 10, 10) |
| 457 | |
| 458 | # Objekt, ki vsebuje lastnosti modela |
| 459 | result = kocka.defaultResult() |
| 460 | |
| 461 | # Raziskovalec oblik: robovi (EDGE) |
| 462 | shapeExplorer = GeomAPI_ShapeExplorer(result.shape(), GeomAPI_Shape.EDGE) |
| 463 | |
| 464 | # Iteriranje skozi robove, dokler jih "raziskovalec robov" še najde |
| 465 | seznam_robov = [] |
| 466 | while shapeExplorer.more(): |
| 467 | # Dodajanje najdenih robov na seznam |
| 468 | izbor = model.selection(result, shapeExplorer.current().edge()) |
| 469 | seznam_robov.append(izbor) |
| 470 | # Iteriranje na naslednji najden rob |
| 471 | shapeExplorer.next() |
| 472 | |
| 473 | # Definiranje radija zaokroževanja |
| 474 | radij = 2 |
| 475 | |
| 476 | # Izvedba zaokrožitve po vseh robovih v seznamu |
| 477 | zaokrozitev = model.addFillet(part_dokument, seznam_robov, radij) |
| 478 | |
| 479 | # Zaključevanje in prikaz modela |
| 480 | model.do() |
| 481 | model.end() |
| 482 | }}} |
| 483 | |
| 484 | |
| 485 | === Primer: Zaokroževanje robov, ki potekajo v smeri Z osi === |
| 486 | |
| 487 | V nadaljevanju je prikazan način za zaokrožitev le tistih robov, ki potekajo v smeri Z osi. |
| 488 | {{{GeomAPI_ShapeExplorer}}} je tu bistvenega pomena in prikaže, kako se lahko is modela |
| 489 | izlušči le tiste elemente, ki ustrezajo določenim pogojem. |
| 490 | |
| 491 | Celotna koda je na voljo tudi [http://trac.lecad.si/vaje/browser/python/SHAPER/fillets/makeFillet_Z_aligned_edges.py tukaj]. |
| 492 | |
| 493 | [[Image(SHAPER_example_makeFillet_Z_aligned_edges.png,right,300px)]] |
| 494 | |
| 495 | {{{ |
| 496 | #!python |
| 497 | |
| 498 | """ |
| 499 | SALOME SHAPER modul: |
| 500 | Primer izdelave zaokrožitve robov le robov, usmerjenih v smeri Z osi. |
| 501 | """ |
| 502 | |
| 503 | from salome.shaper import model |
| 504 | from GeomAPI import * |
| 505 | |
| 506 | # Kreiranje SHAPER session-a |
| 507 | model.begin() |
| 508 | # Kreiranje objekta: t.i. "dokument", ki predstavlja temelje aplikacije |
| 509 | # (root document of SHAPER) |
| 510 | partSet = model.moduleDocument() |
| 511 | # Dodajanje part-a v model |
| 512 | moj_part = model.addPart(partSet) |
| 513 | # Kreiranje objekta za dostop do pod-dokumenta, ki se nanaša na part |
| 514 | part_dokument = moj_part.document() |
| 515 | # Dodajanje kocke |
| 516 | kocka = model.addBox(part_dokument, 10, 10, 10) |
| 517 | |
| 518 | # Objekt, ki vsebuje lastnosti modela |
| 519 | result = kocka.defaultResult() |
| 520 | |
| 521 | # Raziskovalec oblik: robovi (EDGE) |
| 522 | shapeExplorer = GeomAPI_ShapeExplorer(result.shape(), GeomAPI_Shape.EDGE) |
| 523 | |
| 524 | # Iteriranje skozi robove, dokler jih "raziskovalec robov" še najde |
| 525 | seznam_robov = [] |
| 526 | while shapeExplorer.more(): |
| 527 | # Objekt, ki vsebuje lastnosti geometrije trenutno najdenega robu |
| 528 | rob = shapeExplorer.current().edge() |
| 529 | # Objekt, ki se navezuje izbor robu na podlagi vmesnika (interface) |
| 530 | izbor = model.selection(result, rob) |
| 531 | |
| 532 | # XYZ koordinate prve točke robu |
| 533 | prva_tocka = [rob.firstPoint().x(), |
| 534 | rob.firstPoint().y(), |
| 535 | rob.firstPoint().z()] |
| 536 | # XYZ koordinate druge točke robu |
| 537 | druga_tocka = [rob.lastPoint().x(), |
| 538 | rob.lastPoint().y(), |
| 539 | rob.lastPoint().z()] |
| 540 | |
| 541 | # Primerjanje prve in druge točke robu. Robovi, ki potekajo v smeri Z osi |
| 542 | # imajo enaki X in Y koordinati oz. se razlikujejo le po Z koordinati. |
| 543 | # V primeru da je pogoj izpolnjen, naj program doda rob v naš seznam robov |
| 544 | if prva_tocka[0] == druga_tocka[0] and \ |
| 545 | prva_tocka[1] == druga_tocka[1]: |
| 546 | |
| 547 | # Dodajanje najdenih robov na seznam |
| 548 | seznam_robov.append(izbor) |
| 549 | # Iteriranje na naslednji najden rob |
| 550 | shapeExplorer.next() |
| 551 | |
| 552 | # Definiranje radija zaokroževanja |
| 553 | radij = 2 |
| 554 | |
| 555 | # Izvedba zaokrožitve po vseh robovih v seznamu |
| 556 | zaokrozitev = model.addFillet(part_dokument, seznam_robov, radij) |
| 557 | |
| 558 | # DODATNO: |
| 559 | # Ugotavljanje lastnosti roba na podlagi objekta, ki se navezuje na vmesnik |
| 560 | moj_izbrani_rob = seznam_robov[0] |
| 561 | # Dobimo par "result" in "subShape" |
| 562 | result_rob, subShape_rob = moj_izbrani_rob.resultSubShapePair() |
| 563 | # Objekt, ki definira rob |
| 564 | moj_rob = subShape_rob.edge() |
| 565 | # Izpis koordinat robu |
| 566 | print("Prva tocka izbranega robu: x=%.1f, y=%.1f, z=%.1f" % \ |
| 567 | (moj_rob.firstPoint().x(), moj_rob.firstPoint().y(), moj_rob.firstPoint().z())) |
| 568 | print("Druga tocka izbranega robu: x=%.1f, y=%.1f, z=%.1f" % \ |
| 569 | (moj_rob.lastPoint().x(), moj_rob.lastPoint().y(), moj_rob.lastPoint().z())) |
| 570 | |
| 571 | # Zaključevanje in prikaz modela |
| 572 | model.do() |
| 573 | model.end() |
| 574 | }}} |