| | 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 | }}} |