FastFiber

Volgorde commando's

Gestart door JMD, wo 14 10 2009, 07:37:45

Vorige topic - Volgende topic

JMD

Ik ben bezig met een LISP aan het schrijven met meerdere commando's achter elkaar.
Echter de volgorde zoals deze in mijn LISP staat, wordt niet uitgevoerd in AutoCAD.
Wat kan ik hieraan doen??

H@rm

Citaat van: JMD op wo 14 10 2009, 07:37:45
Wat kan ik hieraan doen??

Voor alle duidelijkheid zou je de code hier kunnen posten. Dan zijn er hier genoeg wijze mannen en vrouwen die jou van raad (en daad) kunnen voorzien.

Michel
Acad 10 t/m 2015
Revit 2010 t/m 2015
autodidact lisp

Reimer

Beste JMD,

het probleem van de volgorde heeft mij ook al een bezig gehouden. (zie http://www.cadsite.be/smf/index.php?topic=3064.0)
Ik ontdekte dat binnen een IF functie eerst de laatste regel werd uitgevoerd en daarna de eerste t/m de een na laatste.

Kenny H gaf mij de oplossing: progn.
Alles binnen (progn ...) wordt netjes op volgorde afgehandeld.

Reimer.

JMD

Hierbij de LISP tot zover ik deze nu heb, had vanmorgen nog geen toegang...
Er zijn ook enkele 'eigen' commando's opgenomen.
Wat is nu het probleem: commando TEKENHOOFD wordt als laatste uitgevoerd, zodat ik foutmelding krijg na SAVEAS.
Helaas mag ik de 'eigen' commando's niet meeleveren van systeembeheerder.

Verbeteringen zijn natuurlijk altijd welkom...

Gr JMD


(defun C:utb ()

;;;-----XREEF's binden--------------------------------------------------
 (setvar "bindtype" 0)
 (if (/= (setq ss1 (ssget "X" '((0 . "INSERT")))) nil)
   (progn
     (setq i 0)
     (setq bsl nil)
     (setq bnl nil)
     (repeat (sslength ss1)
   (setq e1 (ssname ss1 i))
   (setq bn (cdr (assoc 2 (entget e1))))
   (setq bl (tblsearch "block" bn))
   (setq bt (cdr (assoc 70 bl)))
   (if (and (= (logand bt 4) 4) (not (member bn bnl)))
     (setq bnl (cons bn bnl))
   )
   (setq i (1+ i))
     )
   )
 )
 (setq i 0)
 (repeat (length bnl)
   (command "-xref" "bind" (nth i bnl))
   (setq i (1+ i))
 )
 (command "-xref" "d" "*")
 (command "-image" "d" "*")
 (prompt "\nGeladen Xref's gebonden\n")
 (prompt "\nOverige Xref's en afbeeldingen verwijderd\n")

;;;-----Alles wat op laag tb-xref staat exploderen----------------------
(command "-layer" "u" "tb-xref" "")
(setq i 0 ss nil ss (ssget "X" (list '(8 . "tb-xref"))))
(if SS (progn
(repeat (sslength ss)
(command "_explode" (ssname ss i))
(setq i (1+ i))
)))

;;;-----Tekening opschonen----------------------------------------------
 (setq cmd (getvar "cmdecho")
       tm (getvar "tilemode")
       llst ""
       la (tblnext "layer" T))
 (setvar "cmdecho" 0)
 (while la
   (setq lnam (cdr (assoc 2 la))
         lfrz (= (logand (cdr (assoc 70 la)) 1) 1)
         loff (minusp (cdr (assoc 62 la))))
   (if (or lfrz loff)
     (progn
       (if (setq ss (ssget "x" (list (cons 8 lnam))))
         (command "_layer" "_u" lnam ""
                  "_erase" ss ""))
       (setq llst (strcat lnam "," llst)
             la (entget (tblobjname "layer" lnam))
             la (subst '(70 . 0)(assoc 70 la) la))
       (entmod la)))
   (setq la (tblnext "layer")))
 (if (> llst "")
   (command "_tilemode" 0))          
 (repeat 3
   (command "_purge" "_a" "*" "n"))
 (setvar "cmdecho" cmd)
 (setvar "tilemode" tm)

;;;-----Diverse commando's----------------------------------------------
(c:TEKENHOOFD)
(c:SCALELISTMETRIC)
(command "-layer" "s" "0" "")
(command "_laydel" "n" "vervallen" "" "y")
(command "ucsfollow" "1")
(command "ucs" "w")
(command "-purge" "a" "" "n")

;;;-----Alles ZE (zoom extents 0.9)-------------------------------------
 (vl-load-com)
 (setq olist nil)
 (setq object (vlax-get-acad-object))
 (setq doc (vla-get-activedocument object))
 (setq layouts (vla-get-layouts doc))
 (vlax-for each layouts
   (setq name (list (vla-get-name each))
    olist (cons name olist)))
 (setq aantal (length olist)
  teller 0)
 (repeat aantal
   (setq lay (car (nth teller olist)))
   (if (/= lay "Model")
     (progn
  (setvar "Ctab" lay)
  (c:ZE)))
   (setq teller (1+ teller)))
 (setvar "Ctab" "Model")
 (c:ZE)
 (vlax-release-object layouts)
 (vlax-release-object doc)
 (vlax-release-object object)

;;;-----SAVEAS met datum voor bestandnaam-------------------------------
(setq dat (getvar "CDATE"))
 (setq jjjj (substr (rtos dat 2 0) 1 4))
 (setq mm (substr (rtos dat 2 0) 5 2))
 (setq dd (substr (rtos dat 2 0) 7 2))
 (setq datum (strcat jjjj mm dd))
(setq dwgnaamext (getvar "dwgname"))
(setq naamlengtetot (strlen dwgnaamext))
(setq naamlengte (- naamlengtetot 4))
(setq dwgnaam (substr dwgnaamext 1 naamlengte))
(setq dwgnaam_n.dwg (strcat datum " " dwgnaam ".dwg"))
(setq dwgpadnaam_n.dwg (strcat (getvar "dwgprefix") dwgnaam_n.dwg))
(if (/= dwgpadnaam_n.dwg (findfile dwgnaam_n.dwg))
    (progn
     (command "saveas" "" dwgpadnaam_n.dwg)
     (alert "Bestand opgeslagen projectmap")
    )
    (progn
     (alert "Dit bestand bestaat al. Het bestand is NIET opnieuw opgeslagen!")
    )
)
(command "_close" "y")
)

roy_043


JMD

Foutmelding, zoiets als VBA-run..

Het probleem zit vooral in commando TEKENHOOFD (VBA-routine). Dit zet ons gewone stempel om in een uitgaand stempel.
Echter voordat commando TEKENHOOFD is uitgevoerd, lopen de volgende commando's verder.
Wat dus betekend dat de tekening opgeslagen (saveas) wordt, voordat commando TEKENHOOFD is uitgevoerd.
Het resultaat is een tekening met daarin de helft van het oude/uitgaande stempel.

Ik hoop dat het duidelijk is...

Grtz JMD

roy_043

#6
Je zou na de aanroep van TEKENHOOFD een delay kunnen inbouwen:
(command "_.delay" 1000) ; 1000 milliseconden wachten.
In de nieuwere versies van Bricscad bestaat ook de lisp-functie sleep. Misschien bestaat daarvoor een equivalent in Autolisp.

Alternatief is om VBA de programma flow te laten sturen.

<EDIT>Interessant is ook de vraag of TEKENHOOFD een waarde retourneert waar je in de lisp wat mee kunt.</EDIT>

JMD

#7
Ik ben er ondertussen achtergekomen waar het 'echte probleem zit'
Het is dus in commando TEKENHOOFD, ik heb hier echter geen schrijfrechten voor.
Maar jullie hebben mij wel op weggeholpen, om na te denken

Gr JMD

FastFiber