Ich kehre zum Thema zurück, weil ich die Lüftung kam, sagen wir, die Notwendigkeit, nach der Schaffung einer Rolle, und vielleicht geändert, um alles auf einem 3d Boden zurückzubringen.
viel komplizierter, bringen Sie auf einem Blatt die Topographie des Zylinders zurück.
Ich streite mich ziemlich ein bisschen mit dem Bug, der in lisp ist nicht da, Verpackung der Formeln, dann gab ich auf, entscheiden für eine rustikalere Methode, die die Cad Arbeit macht, kurz machen ihn ziehen den Bogen von jedem Punkt auf dem Zylinder, so dass ich sagen, die Länge "distinct", und berichtete diese Maßnahme als x-Wert von diesem Punkt im Vergleich zu dem gemeinsamen Ursprung.
nicht einfache Sachen, vor allem weil ein Gesicht auf dem Zylinder auf Pferderücken in weniger als 360 Grad und mehr als 0 Grad stehen kann, was mich der Bogen nicht von trivial Entwicklung macht. von hier aus die Kontrollen; das "reine", das mir sagt, ob ein Gesicht im Bereich 0-360 liegt oder nicht, wenn dann eine oder mehrere Vertikale über die 360.
Der Durchmesser des Zylinders muss jedoch zwingend 2 (Rough 1) und sein Ursprung, das Zentrum des Bodens, bei 0,0.0 gestellt sein. muss als Rollteppich, d.h. 0,0.0, gelegt werden, die Zylinderhöhe wird nach y positiv.
Dies liegt gerade daran, dass das Ergebnis wie das Abrollen eines Zylinderteppichs auf dem Boden, platziert entlang der y-Achse, verteilt auf der x-Achse sein wird. wie wenn du es erschaffen hast.
sogar hier, besser Platz auf einer neuen Schicht vor dem Starten der Routine, weil die neue erstellte Form nicht mit der ersten verschränkt und leicht wählbar ist.
Es ist eine "timbre", so ist es nur für "Einschnitte" auf dem Zylinderdurchmesser überprüft, die positive Volumen auf dem Teppich platziert werden. Ich habe nicht überprüft, was passiert, wenn "der Zylinder Ausstülpungen herauskommt, weil es nicht mein Problem war. ist ein "kontinuierlicher Stempel" 3d. Was auf dem Zylinder graviert wird, wird zu einem Adjektiv auf dem unberollten Teppich mit seiner Topographie führen.
natürlich danke, wenn zufällig jemand Ideen mit einem schärferen Algorithmus hatte!
Code:
(defun mprint()
(setq selez nil)
(setq selez(ssget))
(falls (/= selez nil)
(Prog.)
(setq l(sslength selez))
(Setq l(1- l)
(setq na 0)
(while(<= na l)
(setq ename(ssname selez na))
(setq alist(entget ename))
(if(= "3dface"(cdr(assoc 0 alist))))
(Prog.)
(Setq a (cdr(assoc 10 alist)) b (cdr(assoc 11 alist))) c (cdr(assoc 12 alist))) d (cdr(assoc 13 alist)))
(setq ax) ay (cadr a) az (caddr a) )
(setq bx (car b) von (cadr b) bz (caddr b) )
(Setq cx (car c) cy (cadr c) cz (caddr c))
(setq dx (car d) dy (cadr d) dz (caddr d) )
(oder (< az 0)(< bz 0)(< cz 0)(< dz 0))
(setq sud 1)
(setq sud 0)
)
(Satzkreuz 0)
(falls (< az -0.0001)(Satzkreuz (+ 1 Kreuz)))
(falls (< bz -0.0001)(Satzkreuz (+ 1 Kreuz)))
(falls (< cz -0.0001)(Satzkreuz (+ 1 Kreuz)))
(falls (< dz -0.0001)(Satzkreuz (+ 1 Kreuz)))
(falls (oder (= Kreuz 4)(= Kreuz 0))) (Setq rein 1)(setq rein 0))
,...
(setq newaz (- 1 (sqrt (+ (* ax ax)))))
(setq Punktcent (Liste 100 0 0) )
(setq pointstart (list 101 0 0) )
(setq pointend (list (+ 100 ax) az 0))
(wenn (und (gleich ax 1 0.0001) (= sud 1))
(setq newax 6.28318531)
(Prog.)
(Befehl "arc" "c" Pointcent Pointstart Pointend)
(setq selez2 (ssget pointstart))
(setq ename2 (ssname selez2 0)
(setq nalist (entget ename2))
(setq basarc (cdr(assoc 50 nalist)))
(setq endarc (cdr(assoc 51 nalist)))
(setq svilarc (- endarc basarc))
(entdel ename2)
(setq newax svilarc)
)
)
(setq neway ay) ;solo per leggibilità
................................
(setq newbz (- 1 (sqrt (+ (* bx bx) (* bz bz)))))
(setq Punktcent (Liste 100 0 0) )
(setq pointstart (list 101 0 0) )
(setq pointend (list (+ 100 bx) bz) 0)
(wenn (und (gleich bx 1 0.0001) (= sud 1))
(setq newbx 6.28318531)
(Prog.)
(Befehl "arc" "c" Pointcent Pointstart Pointend)
(setq selez2 (ssget pointstart))
(setq ename2 (ssname selez2 0)
(setq nalist(entget ename2))
(setq basarc (cdr(assoc 50 nalist)))
(setq endarc (cdr(assoc 51 nalist)))
(setq svilarc (- endarc basarc))
(setq newbx svilarc)
(entdel ename2)
)
)
(setq newby von) ;solo per leggibilità
................................
(setq newcz (- 1 (* cx cx) (* cz cz))))
(setq Punktcent (Liste 100 0 0) )
(setq pointstart (list 101 0 0) )
(setq pointend (list (+ 100 cx) cz 0)
(wenn (und (gleich cx 1 0.0001) (= sud 1))
(setq newcx 6.28318531)
(Prog.)
(Befehl "arc" "c" Pointcent Pointstart Pointend)
(setq selez2 (ssget pointstart))
(setq ename2 (ssname selez2 0)
(setq nalist (entget ename2))
(setq basarc (cdr(assoc 50 nalist)))
(setq endarc (cdr(assoc 51 nalist)))
(setq svilarc (- endarc basarc))
(setq newcx svilarc)
(entdel ename2)
)
)
(setq newcy cy)
................................
(setq newdz (- 1 (qrt (+ (* dx dx) (* dz dz))))
(setq Punktcent (Liste 100 0 0) )
(setq pointstart (list 101 0 0) )
(setq pointend (list (+ 100 dx) dz) 0)
(wenn (und (gleich dx 1 0.0001) (= sud 1))
(setq newdx 6.28318531)
(Prog.)
(Befehl "arc" "c" Pointcent Pointstart Pointend)
(setq selez2 (ssget pointstart))
(setq ename2 (ssname selez2 0)
(setq nalist(entget ename2))
(setq basarc (cdr(assoc 50 nalist)))
(setq endarc (cdr(assoc 51 nalist)))
(setq svilarc (- endarc basarc))
(setq newdx svilarc)
(entdel ename2)
)
)
(setq newdy dy) ;solo per leggibilità
(setq newa (list newax neway newaz))
(setq newb (list newbx newby newbz))
(setq newc (list newcx newcy newcz)
(setq newd (list newdx newdy newdz) )
(wenn (= 1 rein)
(Befehl "3dface" newb newc newd ")
(Prog.)
(falls zutreffend)
(Befehl "3dface" newb newc newd ")
(Prog.)
(falls (< newax pi) (setq newax (+ pi newax)))
(falls (< newbx pi) (setq newbx (+ pi newbx)))
(falls (< newcx pi) (setq newcx (+ pi newcx)))
(falls (< newdx pi) (setq newdx (+ pi newdx)))
(setq newa (list newax neway newaz))
(setq newb (list newbx newby newbz))
(setq newc (list newcx newcy newcz)
(setq newd (list newdx newdy newdz) )
(Befehl "3dface" newb newc newd ")
)
)
)
)
)
;endif 3dface
(setq na(1+ na))
)
)
)
) ; close defun