Platzbedarf markieren / Lisp
schachtelmacher 30. Mrz. 2005, 14:53

Hallo,

ich habe wieder mal eine Frage:

Ich frage in einem Lispprogramm nach einem Einfügepunkt,
den ich später zum Einfügen eines Blockes benötige.
Dieser Block hat später eine Ausdehnung in x und y-Richtung.
Kann ich bei der Auswahl an das Fadenkreuz ein Rechteck visuell andocken um den Platzbedarf des Blockes anzuzeigen?
Der Sinn ist, dass ich vorher sehe, ob der Block irgendwo hineinragt,
wo er stören könnte.
Es funtioniert nicht mit der Gummibandlinie, da ich ja kein Aanfangspunkt habe.
Vielleicht eine interessante Aufgabe. Ich hoffe Ihr könnt mir helfen.

Grüsse

Schachtelmacher


CADmium 30. Mrz. 2005, 15:12

Ein wenig Code sagt mehr als 1000 Worte. Hoffe, du kommst damit klar

(defun ....
  (setq P (grread 't 5 0))
  (setq VE (VIERECK (cadr P))
  (while (= 5 (car (setq P (grread 't 5 0))))
    (if VE (entdel VE))
    (setq VE (VIERECK (cadr P)))
  )
  (if (= 3 (car P))
    (command "_insert" ... (cadr P)...)
  )
)

(defun VE (P)
  (entmake
    ...
  )
  (entlast)
)
 


..aber insert bringt doch auch die Faktoren vx vy vz für die Voransicht mit ????

schachtelmacher 30. Mrz. 2005, 15:57

Das mit der Voransicht geht nicht, da der Block
erst später erstellt und fertig eingefügt wird.
Ich weiss aber schon die Abmessungen (z.B. 150 x 210 mm).
Jetzt soll bei der Frage nach dem Einfügepunkt, der durch
getpoint gesetzt wird, ein Rechteck am Fadenkreuz angedockt sein,
um die spätere Position des eingefügten Blocks zu demonstrieren.
Es soll kein Rechteck fest gezeichnet werden, oder eine Voransicht des Blocks
wie bei insert angezeigt werden.
Bei Bewegung des Fadenkreuzes soll das virtuelle Rechteck dem Cursor folgen.

Grüsse

schachtelmacher

marc.scherer 30. Mrz. 2005, 16:05

Hi,
teste mal das hier:
Aufruf mit z.B.:
(PointByCrosshair 40 55.25 155.37)

Code:

;;; Funktion ermittelt einen Punkt bezogen
;;; auf die aktuelle Lage des Fadenkreuzes
;;; Retval ist nil bei Rechtsklick oder Abbruch
;;; oder der Punkt, der bei einem linksklick
;;; vom Fadenkreuz definiert wurde.
;;; Übergabeparameter ist die Farbe, mit der
;;; die rechteckige Markierung gezeichnet werden soll...
(defun PointByCrosshair (color rw hw / P)
  (setq P (grread 't 1)) ;_ lese aktuelle Lage des Crosshairs
  (XORDRAW (cadr P) color rw hw) ;_ zeichne Geometrie um Crosshair
  (while (= 5 (car (setq P (grread 't 1)))) ;_ lese solange nicht linksgeklickt wird
    (redraw) ;_ grvecs löschen
    (XORDRAW (cadr P) color rw hw) ;_ Geometrie an neuer Lage zeichnen
  ) ;_ end of while
  (redraw)
  (if (= 3 (car P))
    (cadr P)
  ) ;_ end of if
) ;_ end of defun

(defun XORDRAW
      (PKT CLR BL-RW BL-HW / HOCH OBL OBR RECHTS UL UR VEK_LIST)
  (setq RECHTS  (car PKT)
        HOCH    (cadr PKT)
        UL      (list (- RECHTS (/ BL-RW 2)) (- HOCH (/ BL-HW 2)))
        UR      (list (+ RECHTS (/ BL-RW 2)) (- HOCH (/ BL-HW 2)))
        OBR      (list (+ RECHTS (/ BL-RW 2)) (+ HOCH (/ BL-HW 2)))
        OBL      (list (- RECHTS (/ BL-RW 2)) (+ HOCH (/ BL-HW 2)))
        VEK_LIST (list CLR UL UR UR OBR OBR OBL OBL UL UL OBR OBL UR)
  ) ;_ end setq
  (grvecs VEK_LIST)
) ;_ end of defun



...

schachtelmacher 30. Mrz. 2005, 16:16

Danke an Euch beide!

Das bringt mich weiter