FastFiber

block aanmaken via Visual Lisp wil niet... (opgelost)

Gestart door zone2000, do 08 05 2008, 14:27:52

Vorige topic - Volgende topic

zone2000

Hallo,

Ik heb een knop gemaakt in AutoCAD die een soort kruis tekent op de oorsprong van de AutoCAD tekening. Dus op punt 0,0,0.
De code van Visual Lisp staat hieronder.
Het kruis tekenen op de oorsprong is op zich goed gelukt, alleen nu wilde ik er een block van maken zodat alle lijnstukken onder één object vallen.
Bij het aanmaken van het block werkt deze code niet meer. Als ik het aangeven stukje code handmatig invoer werkt het wel.
Weet iemand hoe ik dit kan oplossen?

Het gaat om dit stukje code:

(command "-block"
      "orgcross"
      pt1
      (list -7500.0 7500.0 0.0)
      (list 7500.0 -7500.0 0.0)
      ""
      )

Als ik dit handmatig invoer werkt het wel, maar via Visual Lisp dus niet meer.

Alvast bedankt, Lars.


Dit is de hele code:

(defun c:origincross ()
 
  (setq pt1 (list 0.0 0.0 0.0))
  (setq pt2 (list -7500.0 0.0 0.0))
  (setq pt3 (list 7500.0 0.0 0.0))
  (setq pt4 (list 0.0 7500.0 0.0))
  (setq pt5 (list 0.0 -7500.0 0.0))
  (setq w1 (list -7500.0 7500.0 0.0))
  (setq w2 (list 7500.0 -7500.0 0.0))
 
  (command "._circle"
      pt1
      "5000"
      )
 
  (command "._circle"
      pt1
      "1500"
      )
 
  (command ".pline"
      pt2
      pt3
      pt1
      pt4
      pt5
      pt1
      "c"
      )

;Vanaf hier werkt de code niet meer!!!!!!

(command "-block"
      "orgcross"
      pt1
      (list -7500.0 7500.0 0.0)
      (list 7500.0 -7500.0 0.0)
      ""
      )

;Tot hier, de rest werkt wel!!!!!!!!    

  (command "-insert"
      "orgcross"
           pt1
      "1"
      "1"
      "0"
      )
 
  (print "Cross placed at origin")
  (princ)
  (princ)
 
)

zone2000

Aanvulling op hierboven...

Ik ben erachter gekomen dat het fout gaat bij het selecteren van objecten waar ik een block van wil maken.
Via Visual Lisp gaat selecteren anders dan op de handmatige manier.
Iemand een idee hoe ik bijvoorbeeld de laatste 3 getekende objecten kan selecteren via Visual Lisp? Want dan ben ik er ook.

Groeten, Lars.

Kenny H

Beste,

Probeer dit eens  :wink:

Citeer(defun c:origincross ()

  (setq   pt1 (list 0.0 0.0 0.0)
   pt2 (list -7500.0 0.0 0.0)
   pt3 (list 7500.0 0.0 0.0)
   pt4 (list 0.0 7500.0 0.0)
   pt5 (list 0.0 -7500.0 0.0)
   w1  (list -7500.0 7500.0 0.0)
   w2  (list 7500.0 -7500.0 0.0)
  )

  (command "._circle"
      pt1
      "5000"
  )
  (setq e1 (entlast)) ;; entlast --> selectie laatst getekend

  (command "._circle"
      pt1
      "1500"
  )
  (setq e2 (entlast))

  (command ".pline" pt2   pt3 pt1   pt4 pt5   pt1 "c")
  (setq e3 (entlast))
 
  (command "-block" "orgcross" pt1 e1 e2 e3 "")
  (command "-insert" "orgcross"   pt1 "1"   "1" "0")

  (print "Cross placed at origin")
  (princ)
  (princ)

)

Mvg

Kenny
8) Volvo 4 Life 8)

Kenny H

Effe uw fout ondekt

Citeer(command "-block"
      "orgcross5"
      pt1
      (ssget "w" (list -7500.0 7500.0 0.0)
      (list 7500.0 -7500.0 0.0))
   
  ""
      )

Ge waart uw commando voor het selecteren vergeten, enkel de punten waren gegeven end aar liep het op fout.  :wink:
Dit zou normaal ook werken  8)
8) Volvo 4 Life 8)

zone2000

Zeer bedankt voor deze reactie Kenny H. Deze code werkt goed.

Ik heb nog één probleem, als ik tijdelijk het kruis op de oorsprong wil hebben (dus ik delete het kruis na een tijdje weer) en ik wil het kruis daarna nog een keer laten tekenen op de oorsprong dan mislukt het aanmaken van het block.

Dit komt omdat de blocknaam al bestaat en daardoor vraagt AutoCAD of ik het block wil herdefiniëren. Dus AutoCAD verwacht een 'y' of 'n' input van mijn lisp routine terwijl mijn lisp direct coördinaten opgeeft.

Weet jij hier nog iets voor?

Vriendelijk bedankt,

Lars

Petperm

Kan je aan het begin van de lisp niet het volgende ingeven

(command "-purge" "blocks" "orgcross" "no")

Op deze manier wordt de blockdefinitie uit het bestand gehaald áls deze gedelete is natuurlijk.

Kenny H

Citaat van: zone2000 op vr 09 05 2008, 12:10:20
Zeer bedankt voor deze reactie Kenny H. Deze code werkt goed.

Weet jij hier nog iets voor?


Beste Lars,

Als het block bestaat, en je deze iets later delete, en een uur later deze opnieuw nodig hebt, kun je deze toch gewoon opnieuw inserteren?
Dan hoeft deze niet meer getekend te worden.

Daarmee....

Citeer(defun c:origincross ()
(setvar "cmdecho" 0) ;;; laat niets van uw programma zien, in uw commando regel
  (setq   pt1 (list 0.0 0.0 0.0)
   pt2 (list -7500.0 0.0 0.0)
   pt3 (list 7500.0 0.0 0.0)
   pt4 (list 0.0 7500.0 0.0)
   pt5 (list 0.0 -7500.0 0.0)
   w1  (list -7500.0 7500.0 0.0)
   w2  (list 7500.0 -7500.0 0.0)
  )
  (if (not (tblsearch "block" "orgcross")) ;bestaat block al?
    (progn
      (command "._circle"
          pt1
          "5000"
      )
      (setq e1 (entlast))      ;; entlast --> selectie laatst getekend
      (command "._circle"
          pt1
          "1500"
      )
      (setq e2 (entlast))
      (command ".pline" pt2 pt3 pt1 pt4 pt5 pt1 "c")
      (setq e3 (entlast))
      (command "-block" "orgcross" pt1 e1 e2 e3 "")
    )
  )
  (command "-insert" "orgcross" pt1 "1" "1" "0")
  (print "Cross placed at origin")
  (princ)
  (princ)

)

Denk dat dit is wat je zoekt.
En tis graag gedaan :wink:

Kenny
8) Volvo 4 Life 8)

yoin