MCVSIZylinder Faltkarte MiscellaneousC¶ù%>'Zylinder FaltkartegClick to insert.± À@`@P^x@@_È@N@@ø\ˆ@ˆøear Obje" ùùùùùùùùùùùùùùùùùùùùùùìììùùìììùùìììùùùùùùùùùùùùùùùùùùùùùù€€€ü@@@@C„C„C„@@@@üÆß ø  * PaperWidth210 PaperHeight297Radius80 Resolution16MirrorFALSE{ CAAD II SS07 Prof. Hovestadt VectorScript: Folding Object from Paper BaTeamJvS Marcel JŠggi Patrick von Schulthess 'Verdrehte Zylinder' 29.05.2007 Die Dimensionen werden auf mm gesetzt. Der Nullpunkt auf die Mitte des Blattes gesetzt. Es wird 1 neuer Layer erzeugt (falls er nicht schon existiert). Der Name ist eine Konstante Es werden 3 Klassen erzeugt (falls sie nicht schon existieren): Schneiden, vorwŠrts falten, rŸckwŠrts falten. Die Namen sind Konstanten. Die Farben werden von den Klassen Ÿbernommen. } PROCEDURE GenerateCard; {globale Konstanten} CONST {fixe Parameter} BorderSafe = 5; {Mindestrand} {Layer, Klassen, Farben} ThatLayer = 'FoldCard'; ClassCut = 'Schneiden'; LCR = 2^16-1; LCG = 0; LCB = 0; ClassFoldFore = 'VorwŠrtsFalten'; LFR = 0; LFG = 0; LFB = 2^16-1; ClassFoldBack = 'RŸckwŠrtsFalten'; LBR = 0; LBG = (2^15-1); LBB = (2^16-1); {Fehlermeldungen} ErrorMsg1 = 'Abbruch! Einer der Parameter ist Null oder negativ.'; ErrorMsg2 = 'Abbruch! Die Parameter wŸrden zu Schnitten au§erhalb des Blattes fŸhren. Die Form ist zu breit:'; ErrorMsg3 = 'Abbruch! Die Parameter wŸrden zu Schnitten au§erhalb des Blattes fŸhren. Die Form ist zu lang:'; {globale Variablen} VAR {Parameter aus dem GUI} PaperWidth : REAL; {Breite des Papiers} PaperHeight : REAL; {Hšhe des Papiers} Radius : REAL; {Radius der Viertel-Zylinder - stellen natŸrlich auch die Hšhe dar} Resolution : INTEGER; {Anzahl der Stege Pro Halbkreis} Mirror : BOOLEAN; {das Ganze ist gerichtet - also kann mans auch spiegeln ;). Intern werden die X-Werte mit 1 oder -1 multipliziert, auch wenn der Effekt bei den Y-Werten der gleiche wŠre...} {interne Variablen} PieceWidth : REAL; {Breite eines Steges} Direction : INTEGER; {Gespiegelt oder nicht} ActSide : INTEGER; {1 oder -1 je nach dem welche Seite gerade gezeichnet wird} {Laufvariablen} RunVar1 : INTEGER; RunVar2 : INTEGER; {Subprozeduren} PROCEDURE AssignParameters; {Alle Parameter den entsprechenden Variablen zuweisen um eine saubere Trennung zum GUI herzustellen und wŠhrend der Entwicklungsphase die Werte 'hardcoded' zu verwenden.} BEGIN PaperWidth := PPaperWidth; PaperHeight := PPaperHeight; Radius := PRadius; Resolution := PResolution; Mirror := PMirror; {interne, statische Variablen berechnen} PieceWidth := Radius / Resolution; IF (Mirror) THEN Direction := -1 ELSE Direction := 1; END; FUNCTION CheckForErrors : INTEGER; {PrŸft ob die Form mit den angegebenen Parametern auf das Blatt passt oder Werte Null sind} BEGIN CheckForErrors := 0; {PrŸfung ob einer der Parameter = 0 ist} IF ( ( PaperWidth <= 0 ) OR ( PaperHeight <= 0 ) OR ( Radius <= 0 ) OR ( Resolution <= 0 ) ) THEN BEGIN Message(ErrorMsg1); CheckForErrors := 1; END; {PrŸfung der Breite} IF (Radius + BorderSafe > PaperWidth / 2) THEN BEGIN Message(ErrorMsg2); CheckForErrors := 1; END; {PrŸfung der LŠnge - PrŸfung ist notwendig, da die Eingaben nicht einem Hochformat entsprechen mŸssen} IF ( Radius + BorderSafe > PaperHeight / 2 ) THEN BEGIN Message(ErrorMsg3); CheckForErrors := 1; END; END; PROCEDURE PrepareDocument; {Layers u.U. erstellen, Farbe definieren, Ma§stab setzen, Nullpunkt setzen} BEGIN Layer(ThatLayer); SetScale(1); NameClass(ClassCut); SetClPenFore(ClassCut, LCR, LCG, LCB); NameClass(ClassFoldFore); SetClPenFore(ClassFoldFore, LFR, LFG, LFB); NameClass(ClassFoldBack); SetClPenFore(ClassFoldBack, LBR, LBG, LBB); SetOrigin (0,0); Units(4); END; {Hauptprozedur} BEGIN AssignParameters; IF ( CheckForErrors = 0 ) THEN BEGIN PrepareDocument; PenColorByClass; { die Šu§ere Schleife lŠuft nur 2 Mal - einmal fŸr links und einmal fŸr rechts} FOR RunVar1 := 0 TO 1 DO BEGIN ActSide := 2 * RunVar1 - 1; { din innere Schleife lŠuft so oft wie bei Resolution angegeben } FOR RunVar2 := 0 TO Resolution - 1 DO BEGIN { die Kommentare beziehen sich auf die rechte Seite bei Mirrored = False - der Rest wird ja eh nur multipliziert... } { die oberen Knicklinien } NameClass(ClassFoldFore); MoveTo ( Direction * ActSide * ( RunVar2 * PieceWidth ) , ActSide * ( SQRT ( SQR ( Radius ) - SQR ( RunVar2 * PieceWidth ) ) ) ); LineTo ( Direction * ActSide * ( ( RunVar2 + 1 ) * PieceWidth ) , ActSide * ( SQRT ( SQR ( Radius ) - SQR ( RunVar2 * PieceWidth ) ) ) ); { die Schnittlinien } NameClass(ClassCut); LineTo ( Direction * ActSide * ( ( RunVar2 + 1 ) * PieceWidth ) , ActSide * ( SQRT ( SQR ( Radius ) - SQR ( ( RunVar2 + 1 ) * PieceWidth ) ) - Radius ) ); { die mittleren Knicklinien } NameClass(ClassFoldBack); MoveTo ( Direction * ActSide * ( RunVar2 * PieceWidth ) , ActSide * ( SQRT ( SQR ( Radius ) - SQR ( RunVar2 * PieceWidth ) ) - Radius ) ); LineTo ( Direction * ActSide * ( ( RunVar2 + 1 ) * PieceWidth ) , ActSide * ( SQRT ( SQR ( Radius ) - SQR ( RunVar2 * PieceWidth ) ) - Radius ) ); END; { die untere Knicklinie } NameClass(ClassFoldFore); MoveTo ( Direction * ActSide * ( 0 ) , ActSide * ( -Radius ) ); LineTo ( Direction * ActSide * ( Radius ) , ActSide * ( -Radius ) ); END; { Mittlere Linie } NameClass(ClassFoldFore); MoveTo ( -PaperWidth / 2 , 0 ); LineTo ( -Radius , 0 ); MoveTo ( PaperWidth / 2, 0 ); LineTo ( Radius, 0 ); { SeiteRandZeichnen } NameClass(ClassCut); MoveTo ( -PaperWidth / 2, -PaperHeight / 2); LineTo ( PaperWidth / 2, -PaperHeight / 2); LineTo ( PaperWidth / 2, PaperHeight / 2); LineTo ( -PaperWidth / 2, PaperHeight / 2); LineTo ( -PaperWidth / 2, -PaperHeight / 2); END; END; RUN(GenerateCard);Breite des PapiersHšhe des PapiersRadiusStege pro Zylinderseite Gespiegelt