--- title: "Praxis" slug: "praxis" updated: 2024-05-13T08:23:20Z published: 2024-05-13T08:23:20Z canonical: "kb.moveit.at/praxis" --- > ## Documentation Index > Fetch the complete documentation index at: https://kb.moveit.at/llms.txt > Use this file to discover all available pages before exploring further. # Praxis ## Organisation des Programmcodes Generell ist es von Vorteil dass bei jedem Stammdatenprojekt eine globale Variable existiert, auf derer sämtliche Informationen via Attribute abgelegt sind, welche für die Konfiguration, Berechnungen und die Grafik relevant sind. Je besser diese strukturiert ist, umso verständlicher und lesbarer ist der daraus resultierende Programmiercode. Relevante Knoten könnten folgende sein: - Eingabemaße aus der Konfiguration - Profile (Rahmen, Flügel, Schwellen, Pfosten, Sprossen, Glasleisten, …) - Abzugmaße (Rahmen vs Flügel, Flügel vs Pfosten, …) - Teilungen, Teilungsmaße (Bei T-Teilung -> 2 Breiten, 1 Höhe) - Profile die Elemente und Teilelemente repräsentieren (Rechteck aus Gesamtbreite und Gesamthöhe, …) - Teilbreiten und Teilhöhen je Teilelement (Bei T-Teilung wären das 3 Teilbreiten und 3 Teilhöhen) - Extrusionspfade (Gesamtelement, Teilelemente) für Objekte wie Rahmen, Flügel, Glasleiste, Glas, … - ID’s der kreierten Objekte (Rahmen, Flügel, …), diese jeweils für innen, eventuell mitte und außen - Farben - etc. ## GEOMETRISCHE OPERATIONEN IM 2D-BEREICH ### SPLIT Format: StreckenzugListe = SPLIT(Profil, Gerade) Zweck: Ein Profil kann z.b. in zwei Teile geschnitten werden. Die Variable Gerade spezifiziert die Strecke, wie z.b. gerade = SEGMENT([100,0],[100,100]). Kann das Profil geteilt werden so enthält StreckenzugListe zwei Teile die wiederum vom Typ Liste sind. Andere Beispiele: ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/Split.png) ### Extrude Format: Profil = EXTRUDE(ProfilAlt, lstAbstaende) Profil = EXTRUDE(ProfilAlt, nAbstand) Zweck: Ein Profil kann vergrößert bzw. verkleinert werden. Dies kann über verschiedene Abstände oder überall gleich mit einem Abstand realisiert werden. (lstAbstaende.NUM muß gleich ProfilAlt.NUM sein!) Beispiel: Profil mit 4 Streckenzügen und 2 Bögen vor und nach negativem Extrude! ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/extrude.png) S1 = SEGMENT(P1, P2) S2 = SEGMENT(P2, P3) K3 = ARCFROMSTRINGH(P3,P4,100) lstP={S1,S2,K3,S4,K5,S6} lstA={-10,-5,-5,-5,-5,-5} lstN=EXTRUDE(lstP, lstA} ### Distance Format: Vd = DISTANCE(V, AB) Zweck: Ermittelt den geringsten Abstand zwischen einem Punkt und einer Geraden. Beispiel: A = [3,0] B = [7,4] AB = SEGMENT(A,B) P = POINT(3,4) d = DISTANCE(P, AB) !von P aus mit [-2,2] auf AB P_AB = SEGMENT(P, P+d) !Vektoraddition MESSAGE P_AB.MOD!Wurzel aus 8 = 2.828... ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/distance.png) ### Intersection Format: lstPunkte = INTERSECTION(gerade1/bogen, gerade2/bogen) lstPunkte = INTERSECTION(gerade1/bogen, gerade2/bogen, UNRESTRICTED) Zweck: Ermittelt die Schnittpunkte zwischen einer/einem Geraden/Kreisbogen und einer/einem anderen Geraden/Kreisbogen. Das Ergebnis kann eine leere Liste sein, oder Liste mit einem oder zwei Schnittpunkten (Kreisbogen mit Gerade). Die Option UNRESTRICTED verlängert beide Geraden ins Unendliche – somit wird garantiert wenn die Geraden nicht parallel sind, das immer ein Schnittpunkt gefunden wird. Beispiel: g1 = SEGMENT([0,0],[1,1]) g2 = SEGMENT([1,0],[0,1]) lstP = INTERSECTION(g1, g2) !lstP = {[0.5,0.5]} ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/intersection.png) ### Inside Format: bet = INSIDE (Punkt, lstProfil) Zweck: Die Funktion INSIDE prüft, ob ein Punkt innerhalb oder außerhalb von lstProfil liegt Bemerkungen: bRet hat den Wert 1 wenn der Punkt innerhalb oder auf der Polyline lstProfil liegt, sonst 0! Punkt vom Typ Vector wird überprüft. lstProfil ist eine geschlossene Polyline (beliebige Strecken und Kreisbögen). Beispiel: !Polyline zusammenstellen S1 = SEGMENT([2,1], [13.5,0.5]) K2 = ARC([13.5,5.5], [13.5,0.5], -PI/2) K3 = ARC([10,2.5], [8.5,5.5], PI/2) K4 = ARC([9.5,3.5], [7,1], -PI/2) K5 = ARC([7,3], [7,6], PI/2) K6 = ARC([2,3], [4,3], -PI/2) !Sicherstellen, daß die Polyline geschlossen ist PL = ADJUST ({S1, K2, K3, K4, K5, K6}) !Einige beliebige Punkte definieren V1 = [5,2]: V2 = [11,5] :v3 = [8,5] !SP wird als Schnittpunkt erzeugt V4 = [5.97,3.5] S2 = SEGMENT([3,4],[5,4]) SP = INTERSECT(S2, K5) !SP ist eine Liste !Die einzelnen Punkte prüfen Erg1 = INSIDE(V1, PL) !V1 liegt innerhalb, Erg1 = 1 Erg2 = INSIDE(V2, PL) !V2 liegt außerhalb, Erg1 = 0 Erg3 = INSIDE(V3, PL) !V3 liegt innerhalb, Erg1 = 1 !SP[1] liegt genau auf PL, Erg1 = 1 Erg4 = INSIDE(SP[1], PL) !Wert von SP[1]= [4.17157, 4] !Ein Punkt ganz knapp neben SP[1] liegt außerhalb, Erg1 = 0 Erg5 = INSIDE([4.17157, 4.0001], PL) ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/inside.png) ### Rotate Format: ergObj = ROTATE(obj, drehwinkel) Zweck: Dreht ein Objekt um einen bestimmten Winkel. Das Zentrum ist [0,0] Bemerkungen obj kann ein Objekt vom Typ Vector, Segment, Arc oder Polyline (Profil) sein drehwinkel ist ein Winkel im Bogenmaß. Bei einem DrehWinkel von 2 * PI (360 °) wird das Objekt ergObj wieder auf das Objekt obj abgebildet Beispiel: A = [3,1] B = [2,5] AB = SEGMENT(A, B) AB2 = ROTATE(AB, PI/2) !AB2 hat die Punkte [-1,3] und [-5,2] !tan alpha = H / B p1 = [3,4] : p2 = [4, 3] p3 = ROTATE(p1, -(ATN(4/3)-ATN(3/4))) ### Scale Format: erg = SCALE(obj, faktor) Zweck: Skaliert einen Vektor oder einen Streckenzug um einen Faktor Beispiel: seg1 = segment([0,0],[3,4]) !seg1.mod = 5 seg2 = scale(seg1, 2) ## Beispiele ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/beispiele.png) !REGION InmFmUebungG02 PROCEDURE InmFmUebungG02 RUN public\LIB.SETDEFAULTPREFERENCES RUN public\LIB.SHOWVERSIONNUMBERSANDLOGO ViewLst = {{"1", "3,4"}, {"2", "3,4"}, {"3", "1,2"}, {"4", "1,2"} } RUN public\lib3D.INITIALIZEGRAPHICSYSTEM("Gascad3D", true, true, true, 2, 0, ViewLst) objFigur = "" objFigur.Ids = "" objFigur.Ids.Quader1 = 0 objFigur.Ids.Quader2 = 0 objFigur.Ids.Quader3 = 0 objFigur.Ids.ZylinderMittig = 0 objFigur.Ids.ZylinderOben = 0 objFigur.Ids.Kegel = 0 objFigur.Ids.Spitze = 0 objFigur.Ids.Rand = 0 objFigur.IDs.Griff = 0 objFigur.Ids.Bemassung1 = 0 objFigur.Ids.Bemassung2 = 0 objFigur.Ids.Bemassung3 = 0 objFigur.Breite = 0 objFigur.Hoehe = 0 objFigur.Hoehe1 = 0 objFigur.Hoehe2 = 0 objFigur.Radius = 0 cCatalogDirectory = "..\..\..\#Zentrale_Materialien\OBJ\moveit" END !ENDREGION !REGION VdmFpZeichnen PROCEDURE VdmFpZeichnen DEFINE VARIABLE id, idGroup, idNeuHaus, idSpiegelHaus1, idSpiegelHaus2 !Werte vorbereiten id = 0 objFigur.Breite = FpBreite objFigur.Hoehe1 = FpHoehe1 objFigur.Hoehe2 = FpHoehe2 objFigur.Radius = FpRadius objFigur.Hoehe = objFigur.Hoehe1 * 5 + objFigur.Hoehe2 +objFigur.Radius !Quader vorne bis hinten RUN public\lib3d.DRAWBOX(id, objFigur.Breite/2, objFigur.Breite, objFigur.Hoehe1) RUN public\lib3d.TRANSLATEBY(id, objFigur.Breite/4, 0, 0) RUN public\lib3d.SetelementMaterial(id, "m0-RAL6018", cCatalogDirectory) RUN public\lib3d.BEAUTIFY(id, 30) RUN public\lib3d.SMOOTH(id, 30) objFigur.IDs.Quader1 = id !Quader rechts bis links RUN public\lib3d.DRAWBOX(id, objFigur.Breite, objFigur.Breite/2, objFigur.Hoehe1) RUN public\lib3d.TRANSLATEBY(id, 0, objFigur.Breite/4, 0) RUN public\lib3d.SETELEMENTMATERIAL(id, "m0-RAL6018", cCatalogDirectory) RUN public\lib3d.BEAUTIFY(id, 30) RUN public\lib3d.SMOOTH(id, 30) objFigur.IDs.Quader2 = id !Quader rechts vorne RUN public\lib3d.DRAWBOX(id, objFigur.Radius, objFigur.Radius, objFigur.Hoehe1) RUN public\lib3d.TRANSLATEBY(id, objFigur.Breite*3/4-objFigur.Radius, 0, objFigur.Hoehe1) RUN public\lib3d.SETELEMENTMATERIAL(id, "m0-RAL5019", cCatalogDirectory) RUN public\lib3d.BEAUTIFY(id, 30) RUN public\lib3d.SMOOTH(id, 30) objFigur.IDs.Quader3 = id !Zylinder mittig RUN public\LIB3D.DRAWCYLINDER(id, objFigur.Breite/4, objFigur.Hoehe2, 60) RUN public\lib3d.SETELEMENTMATERIAL(id, "m0-RAL1003", cCatalogDirectory) RUN public\lib3d.TRANSLATEBY(id, objFigur.Breite/2, objFigur.Breite/2, objFigur.Hoehe1) RUN public\lib3d.BEAUTIFY(id, 30) RUN public\lib3d.SMOOTH(id, 30) objFigur.IDs.ZylinderMittig = id !Zylinder oben RUN public\LIB3D.DRAWCYLINDER(id, objFigur.Breite/2, objFigur.Hoehe1, 60) RUN public\lib3d.SETELEMENTMATERIAL(id, "m0-RAL5019", cCatalogDirectory) RUN public\lib3d.translateby(id, objFigur.Breite/2, objFigur.Breite/2, objFigur.Hoehe1+objFigur.Hoehe2) RUN public\lib3d.beautify(id, 30) RUN public\lib3d.smooth(id, 30) objFigur.IDs.ZylinderOben = id !Kegel oben RUN public\LIB3D.DRAWCONE(id, objFigur.Breite/2, objFigur.Radius, objFigur.Hoehe1*3, 60) RUN public\lib3d.SETELEMENTMATERIAL(id, "m0-RAL3001", cCatalogDirectory) RUN public\lib3d.TRANSLATEBY(id, objFigur.Breite/2, objFigur.Breite/2, objFigur.Hoehe1*2+objFigur.Hoehe2) RUN public\lib3d.BEAUTIFY(id, 30) RUN public\lib3d.SMOOTH(id, 30) objFigur.IDs.Kegel = id !Kugel oben RUN public\LIB3D.DRAWSPHERE(id, objFigur.Radius, 60, 60) RUN public\lib3d.SETELEMENTMATERIAL(id, "m0-RAL1003", cCatalogDirectory) RUN public\lib3d.TRANSLATEBY(id, objFigur.Breite/2, objFigur.Breite/2, objFigur.Hoehe1*5 + objFigur.Hoehe2) RUN public\lib3d.BEAUTIFY(id, 30) RUN public\lib3d.SMOOTH(id, 30) objFigur.IDs.Kugel = id !Rand oben RUN public\LIB3D.DRAWTORUS(id, objFigur.Breite/2, objFigur.Radius, 60, 60) RUN public\lib3d.SETELEMENTMATERIAL(id, "m0-RAL1003", cCatalogDirectory) RUN public\lib3d.TRANSLATEBY(id, objFigur.Breite/2, objFigur.Breite/2, objFigur.Hoehe1*2 + objFigur.Hoehe2) RUN public\lib3d.BEAUTIFY(id, 30) RUN public\lib3d.SMOOTH(id, 30) objFigur.IDs.Rand = id id = 0 RUN public\lib3D.LOADOBJECT(id, path + "OBJ\GRIFF.A3D", "Griff") !RUN public\lib3D.LoadObject(id, path + "OBJ\TEST.A3D", "OBJExportDrawing") nSizeX = 0 : nSizeY = 0 : nSizeZ = 0 RUN public\lib3d.GETELEMENTSIZE(id, nSizeX, nSizeY, nSizeZ) RUN public\lib3d.TRANSLATEBY(id, objFigur.Breite/2 - nSizeX/2, objFigur.Breite/4 - nSizeY, objFigur.Hoehe1 + objFigur.Hoehe2/2 - nSizeZ/2) objFigur.IDs.Griff = id objFigur.IDs.Bemassung1 = 0 RUN public\LIB3D.DRAWMEASURELINE(objFigur.IDs.Bemassung1, 0, 0, -200, objFigur.Breite, 0, -200, "") objFigur.IDs.Bemassung2 = 0 RUN public\LIB3D.DRAWMEASURELINE(objFigur.IDs.Bemassung2, -200, 0, 0, -200, 0, objFigur.Hoehe, "") objFigur.IDs.Bemassung3 = 0 RUN public\LIB3D.DRAWMEASUREOBJECT(objFigur.IDs.Quader1, objFigur.IDs.Bemassung3, true, 0, true) objFigur.IDs.Text = 0 RUN public\lib3D.ADDTEXT(objFigur.IDs.Text, "Griff", "Arial", 60, 30) nSizeX = 0 : nSizeY = 0 : nSizeZ = 0 RUN public\lib3d.GETELEMENTSIZE(objFigur.IDs.Text, nSizeX, nSizeY, nSizeZ) RUN public\lib3d.SETELEMENTMATERIAL(objFigur.IDs.Text, "m0-RAL9005", cCatalogDirectory) RUN public\lib3d.RotateBy(objFigur.IDs.Text, 1, 0, 0, 0, 90) !RUN public\lib3d.RotateBy(objFigur.IDs.Text, 1, 0, 0, 0, 90) !um 180° gedreht, wenn beide Anweisung weggelassen werden und nur untere Anweisung ausgeführt wird, stimmt es wieder !RUN public\lib3d.Rotateto(objFigur.IDs.Text, 1, 0, 0, 0, 90) RUN public\lib3d.TRANSLATEBY(objFigur.IDs.Text, objFigur.Breite/2-nSizeX/2, 10, objFigur.Hoehe1+25+nSizeZ) !Haus idGroup = 0 RUN public\lib3d.CREATEPRODUCT(idGroup, "Haus") RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.Quader1) RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.Quader2) RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.Quader3) RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.ZylinderMittig) RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.ZylinderOben) RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.Kegel) RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.Kugel) RUN public\lib3d.ENGROUP(idGroup, objFigur.IDs.Rand) !Haus kopieren idNeuHaus = 0 RUN public\lib3d.COPY(idGroup, idNeuHaus) RUN public\lib3d.TRANSLATEBY(idNeuHaus, objFigur.Breite * 1.2, 0, 0) !Haus spiegeln idSpiegelhaus1 = 0 RUN public\lib3d.MIRROR(idGroup, idSpiegelhaus1) RUN public\lib3d.TRANSLATEBY(idSpiegelhaus1, -objFigur.Breite * 1.2, 0, 0) idSpiegelhaus2 = 0 RUN public\lib3d.MIRROREX(idGroup, idSpiegelhaus2, 3) RUN public\lib3d.TRANSLATEBY(idSpiegelhaus2, 0, 0, objFigur.Hoehe * 2) END !ENDREGION ### Winkelsymmetrale ermitteln Dreieck 1 ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/Dreieck1.png) Dreieck 2 ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/dreieck2.png) Dreieck 3 ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/dreieck3.png) PROCEDURE WinkelSymmetrale DEFINE VARIABLE p1, p2, p3, p4, lstVonHintenNachVorne DEFINE VARIABLE vek1, vek2, vek3, vek4, vek5, vek6 DEFINE VARIABLE seg1, seg2, seg3, seg4, wGrad, wRad DEFINE VARIABLE NeuerWinkel, NeuerVektor1, NeuerVektor2, Schnittpunkte DEFINE VARIABLE lstUDreieck, lstODreieck, idU, idO !Dreieck 1 !p1 = [ 0, 0] !p2 = [900, 0] !p3 = [500, 300] !Dreieck 2 !p1 = [900, 0] !p2 = [500, 300] !p3 = [ 0, 0] !Dreieck 3 p1 = [500, 300] p2 = [ 0, 0] p3 = [900, 0] seg1 = SEGMENT(p1, p2) vek1 = seg1.V1 vek2 = seg1.V2 seg2 = segment(p2, p3) vek3 = seg2.V1 vek4 = seg2.V2 vek5 = vek2 - vek1 vek6 = vek4 - vek3 wGrad = 180 - ACOS((vek5*vek6) / vek5.MOD / vek6.MOD) * 180/PI wRad = PI - ACOS((vek5*vek6) / vek5.MOD / vek6.MOD) !message wGrad !message seg2.arg * 180 / PI seg3 = SEGMENT(p3, p1) NeuerWinkel = seg2.arg + wRad / 2 seg4 = seg2 seg4.arg = seg4.arg + wRad / 2 Schnittpunkte = INTERSECTION(seg3, seg4, UNRESTRICTED) IF Schnittpunkte.NUM > 0 THEN p4 = Schnittpunkte[1] lstVonHintenNachVorne = {{0,10,0},{0,0,0}} lstUDreieck = {segment(p1,p2), segment(p2, p4), segment(p4,p1)} idU = 0 RUN PUBLIC\lib3d.EXTRUSION(idU, lstUDreieck, [0,0], {0,1,0}, {lstVonHintenNachVorne}) RUN PUBLIC\lib3d.SETELEMENTMATERIAL(idU, "Rot") lstODreieck = {segment(p2,p3), segment(p3, p4), segment(p4,p2)} idO = 0 RUN PUBLIC\lib3d.EXTRUSION(idO, lstODreieck, [0,0], {0,1,0}, {lstVonHintenNachVorne}) RUN PUBLIC\lib3d.SETELEMENTMATERIAL(idO, "Blau") MESSAGE p4 ENDIF END ## Zylinder teilen ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/zylinder teilen.png) DEFINE VARIABLE idZ1, idZ2 DEFINE VARIABLE idZ3, idZ4 DEFINE VARIABLE idZ5, idZ6 idZ1 = 0 : idZ2 = 0 RUN PUBLIC\LIB3D.DRAWCYLINDER(idZ1, 100, 400, 36) RUN PUBLIC\LIB3D.CutObject(idZ1, idZ2, 0, 0, 200, !0;0;200, 200 ist die Schnitthoehe, Punkt wo Normalvektor weggeht 0,0,1,!Normalvektor 0) !Beide Ids behalten RUN PUBLIC\LIB3d.TRANSLATEBY(idZ1, -25,0,0) RUN PUBLIC\LIB3d.TRANSLATEBY(idZ2, 25,0,0) RUN PUBLIC\LIB3D.BEAUTIFY(idZ1, 30) RUN PUBLIC\LIB3d.SMOOTH(idZ1, 30) RUN PUBLIC\LIB3D.BEAUTIFY(idZ2, 30) RUN PUBLIC\LIB3d.SMOOTH(idZ2, 30) idZ3 = 0 : idZ4 = 0 RUN PUBLIC\LIB3D.DRAWCYLINDER(idZ3, 100, 400, 36) RUN PUBLIC\LIB3D.CutObject(idZ3, idZ4, 25, 0, 0, !25;0;0, 25 ist die Schnittposition, Punkt wo Normalvektor weggeht 1,0,0, !Normalvektor 0) !Beide Ids behalten RUN PUBLIC\LIB3d.TRANSLATEBY(idZ3, 230,0,-25) RUN PUBLIC\LIB3d.TRANSLATEBY(idZ4, 230,0,25) RUN PUBLIC\LIB3D.BEAUTIFY(idZ3, 30) RUN PUBLIC\LIB3d.SMOOTH(idZ3, 30) RUN PUBLIC\LIB3D.BEAUTIFY(idZ4, 30) RUN PUBLIC\LIB3d.SMOOTH(idZ4, 30) idZ5 = 0 : idZ6 = 0 RUN PUBLIC\LIB3D.DRAWCYLINDER(idZ5, 100, 400, 36) RUN PUBLIC\LIB3D.CUTOBJECT(idZ5, idZ6, 25, 0, 200, !25;0;200, 25;200 ist die Startposition des Normalvektor 1,0,1,!Normalvektor 0) !Beide Ids behalten RUN PUBLIC\LIB3d.TRANSLATEBY(idZ5, 440,0,-25) RUN PUBLIC\LIB3d.TRANSLATEBY(idZ6, 440,0,25) RUN PUBLIC\LIB3D.BEAUTIFY(idZ5, 30) RUN PUBLIC\LIB3d.SMOOTH(idZ5, 30) RUN PUBLIC\LIB3D.BEAUTIFY(idZ6, 30) RUN PUBLIC\LIB3d.SMOOTH(idZ6, 30) !Mit Winkel schneiden w = 80 * PI / 180 !Winkel mit 80 Grad nX = TAN(w) nY = 0 nZ = 1 RUN PUBLIC\LIB3D.DRAWCYLINDER(idZ5, 100, 400, 36) RUN PUBLIC\LIB3D.CUTOBJECT(idZ5, idZ6, 25, 0, 200, !200 ist die Schnitthoehe, Punkt wo Normalvektor weggeht -nX,0,nZ, !Normalvektor 0) !Beide Ids behalten ### Fangpunkte und Fanglinien ![](https://cdn.document360.io/3757b259-159c-4720-a193-d5c07ebc9cf7/Images/Documentation/Fangpunkte.png) !Profile p1 = [20,0] : p2 = [50,0] : p3 = [70,20] : p4 = [70,50]: p5 = [50,70] p6 = [20,70] : p7 = [0,50] : p8 = [0,20] lstProfilAchtEck = {SEGMENT(p1,p2), SEGMENT(p2,p3), SEGMENT(p3,p4), SEGMENT(p4,p5), SEGMENT(p5,p6), SEGMENT(p6,p7), SEGMENT(p7,p8), SEGMENT(p8,p1)} !Hoehen lAchtEckHoehe = 400 lSchwertHoehe = lAchtEckHoehe / 4 !Achteck zeichnen idAchteck = 0 RUN PUBLIC\LIB3D.EXTRUSION(idAchtEck, lstProfilAchtEck, [0,0], {1,0,0},{{{0,0,0},{0,0,lAchteckHoehe}}}) RUN PUBLIC\LIB3d.BEAUTIFY(idAchtEck,30) !Nach oben (wie Achteck) !1,0,0 0,1,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP1", "*", 35,70,0, 1,0,0,0,1,0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP1", "*", 15,0,0, 1,0,0,0,1,0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP1", idAchtEck, "CP1") !Nordwest !1,-1,0 1,1,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP2", "*", 10,60,0, 1, 0, 0,0, 1, 0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP2", "*", 15, 0,0, 1,-1, 0,1, 1, 0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP2", idAchtEck, "CP2") !West !0,-1,0 1,0,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP3", "*", 0,35,0, 1, 0, 0,0, 1, 0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP3", "*", 15,0,0, 0,-1, 0,1, 0, 0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP3", idAchtEck, "CP3") !Südwest !-1,-1,0 1,-1,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP4", "*", 10,10,0, 1, 0, 0,0, 1, 0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP4", "*", 15, 0,0, -1,-1, 0,1,-1, 0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP4", idAchtEck, "CP4") !Süd !-1,0,0 0,-1,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP5", "*", 35,0,0, 1, 0, 0,0, 1, 0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP5", "*", 15,0,0, -1, 0, 0,0,-1, 0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP5", idAchtEck, "CP5") !Südost !-1,1,0 -1,-1,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP6", "*", 60,10,0, 1, 0, 0,0, 1, 0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP6", "*", 15, 0,0, -1, 1, 0,-1,-1, 0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP6", idAchtEck, "CP6") !Osten !0,1,0 -1,0,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP7", "*", 70,35,0, 1, 0, 0,0, 1, 0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP7", "*", 15,0,0, 0, 1, 0,-1, 0, 0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP7", idAchtEck, "CP7") !Nordost !1,1,0 -1,1,0 idSchwert = 0 RUN KreiereSchwert(idSchwert, lSchwertHoehe) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idAchtEck, "CP8", "*", 60,60,0, 1, 0, 0,0, 1, 0) RUN PUBLIC\LIB3d.ADDCATCHPOINTORIENTATION(idSchwert, "CP8", "*", 15, 0,0, 1, 1, 0,-1, 1, 0) RUN PUBLIC\LIB3d.CATCHALIGN(idSchwert, "CP8", idAchtEck, "CP8") PROCEDURE KreiereSchwert DEFINE PARAMETER INPUTOUTPUT pid, INPUT plSchwertHoehe DEFINE VARIABLE p1, p2, p3, p4, p5, p6, p7, p8, p9,p10,p11 DEFINE VARIABLE idSchwert DEFINE VARIABLE lstProfilSchwert p1 = [10,0] : p2 = [20,0]: p3 = [20,10] : p4 = [30,10] : p5 = [30,20] : p6 = [20,20] p7 = [15,70]: p8 = [10,20] : p9 = [0,20] : p10 = [0,10] : p11 = [10,10] lstProfilSchwert = {SEGMENT(p1,p2), SEGMENT(p2,p3), SEGMENT(p3,p4), SEGMENT(p4,p5), SEGMENT(p5,p6), SEGMENT(p6,p7), SEGMENT(p7,p8), SEGMENT(p8,p9), SEGMENT(p9,p10), SEGMENT(p10,p11), SEGMENT(p11,p1)} idSchwert = 0 RUN PUBLIC\LIB3D.EXTRUSION(idSchwert, lstProfilSchwert, [0,0], {1,0,0},{{{0,0,0},{0,0,plSchwertHoehe}}}) RUN PUBLIC\LIB3d.BEAUTIFY(idSchwert,30) pid = idSchwert END