Praxis
  • 13 May 2024
  • 8 Minutes to read
  • Dark
    Light
  • PDF

Praxis

  • Dark
    Light
  • PDF

The content is currently unavailable in English. You are viewing the default German version.
Article summary

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


Was this article helpful?