- 13 May 2024
- 8 Minutes to read
- Print
- DarkLight
- PDF
Praxis
- Updated on 13 May 2024
- 8 Minutes to read
- Print
- DarkLight
- PDF
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:
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!
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...
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]}
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)
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
!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
Dreieck 2
Dreieck 3
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
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
!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