yoin

netadmin

Hallo,

1 van onze tekenaars heeft sinds deze week Autocad 10 en 1 van onze LISP routines hapert sindsdien, nl. een routine om de tekening te printen mits selectie van begin en eindpunt.
De fout die we krijgen is : "geef tweede punt: ; error: bad argument type: consp 0.0"
Diezelfde code liep nochtans vlekkeloos in Autocad 2007 & 2009.
Ik zet de code hier nog onder, maar ik betwijfel dat daar het probleem ligt aangezien ze vroeger altijd werkte (en nu nog steeds bij andere tekenaars met oudere versies van ACAD)

Iemand enig idee ?

Dit is de code :

(defun C:4250 ()
;automatisch printen naar printer 4250n
  (setq p1 (getpoint "\n Geef eerste punt: "))
  (setq p2 (getpoint "\n geef tweede punt: "))
  (setq obj1 (ssget "w" p1 p2))
  (setq count 0)

    (if (/= obj1 nil)
   (while (< count (sslength obj1))
      (setq eerstvolgende (entget (ssname obj1 count)))
      (setq wat (cdr (assoc 0 eerstvolgende)))
      (setq layer (cdr (assoc 8 eerstvolgende)))
         (if (= wat "LWPOLYLINE")
         (progn
         (if (= layer "_kader A4")
          (progn
            (setq punt1 (cdr (nth 14 eerstvolgende)))
              (if (= punt1 0.0)
          (setq punt1 (cdr (nth 15 eerstvolgende)))
         )
            (setq punt2 (cdr (nth 22 eerstvolgende)))
              (if (= punt2 0.0)
          (setq punt2 (cdr (nth 23 eerstvolgende)))
         )
            (setq hoogte (abs (- (car punt1) (car punt2))))
            (setq breedte (abs (- (cadr punt1) (cadr punt2))))
                   (if (< hoogte breedte)
                 (setq liggend "Portrait")
                 (setq liggend "Landscape")
                    )
;(command "ltscale" "1")
            (command "plot" "y" "" "\\\\Server\062\\HP\040Laserjet\0404250N" "A4" "" liggend "" "w" punt1 punt2 "" "" "" "firmanaam.ctb" "" "" "" "y" "y")
;(command "ltscale" "10")
           )
           )
                    )
          )
          (setq count (1+ count))
   )
      )
)

roy_043

#1
Beste netadmin,

Jouw probleem wordt veroorzaakt door de LISP-code. Deze sluit blijkbaar niet aan bij de volgorde van de entity-data in de laatste versie van AutoCAD.

In de code wordt gebruik gemaakt van nth. Hiermee wordt verwezen naar een bepaalde plaats in de lijst met entity-data. (nth 14 eerstvolgende) verwijst naar het 15e element in de lijst eerstvolgende. Per versie van AutoCAD zal de volgorde van de elementen in de lijst met entity-data variëren. Uit de code blijkt dat dit probleem al eens eerder aan de orde is geweest:


(setq punt1 (cdr (nth 14 eerstvolgende)))
(if (= punt1 0.0)
(setq punt1 (cdr (nth 15 eerstvolgende)))
)


Je zou de code nu op dezelfde manier kunnen aanpassen:


(setq punt1 (cdr (nth 14 eerstvolgende)))
(if (= punt1 0.0)
(setq punt1 (cdr (nth 15 eerstvolgende)))
)
(if (= punt1 0.0)
(setq punt1 (cdr (nth xx eerstvolgende))) ; "nth xx" staat voor de plaats van een hoekpunt in AC2010
)


Maar het is verstandiger om de code zodanig aan te passen dat de volgorde van de lijst met entity-data niets meer uitmaakt:


(defun STM-ENTLIST-FILTER (entLst filterLst / a entLstItem filterLstItem lstIn lstOut)
(foreach entLstItem entLst
(setq a (car entLstItem))
(foreach filterLstItem filterLst
(if (= a filterLstItem)
(setq
lstIn (append lstIn (list entLstItem))
entLstItem nil
)
)
)
(if entLstItem
(setq lstOut (append lstOut (list entLstItem)))
)
)
(list lstIn lstOut)
)

(defun GetPlinePoints (entLst /)
(car (STM-ENTLIST-FILTER entLst '(10)))
)

(defun c:GL () (c:GetList))
(defun c:GetList (/ entName entLst a)
(setq entName (car (entsel "\nSelect entity: ")))
(setq entLst (entget entName))
(textscr)
(foreach a entLst
(print a)
)
(princ)
)

(defun C:4250 ()
;automatisch printen naar printer 4250n
(setq p1 (getpoint "\n Geef eerste punt: "))
(setq p2 (getpoint "\n geef tweede punt: "))
(setq obj1 (ssget "w" p1 p2))
(setq count 0)
(if (/= obj1 nil)
(while (< count (sslength obj1))
(setq eerstvolgende (entget (ssname obj1 count)))
(setq wat (cdr (assoc 0 eerstvolgende)))
(setq layer (cdr (assoc 8 eerstvolgende)))
(if (and (= wat "LWPOLYLINE") (= layer "_kader A4"))
(progn
(setq puntenVanPolylijn (GetPlinePoints eerstvolgende))
(setq punt1 (cdr (nth 0 puntenVanPolylijn)))
(setq punt2 (cdr (nth 2 puntenVanPolylijn)))
(setq hoogte (abs (- (car punt1) (car punt2))))
(setq breedte (abs (- (cadr punt1) (cadr punt2))))
(if (< hoogte breedte)
(setq liggend "Portrait")
(setq liggend "Landscape")
)
;(command "ltscale" "1")
(command "plot" "y" "" "\\\\Server\062\\HP\040Laserjet\0404250N" "A4" "" liggend "" "w" punt1 punt2 "" "" "" "firmanaam.ctb" "" "" "" "y" "y")
;(command "ltscale" "10")
)
)
(setq count (1+ count))
)
)
(princ)
)


De voorafgaande code bevat 4 functies:

- STM-ENTLIST-FILTER:
Algemene filterfunctie.

- GetPlinePoints:
Deze functie roept STM-ENTLIST-FILTER aan en retourneert een lijst met alleen de hoekpunten van de polylijn.

- GetList (ook beschikbaar als GL):
Deze functie geeft de lijst met entity-data van een gekozen element op het scherm weer. Gebruik deze functie om de entity-data van een polylijn in AC2009 en AC2010 te vergelijken. Je zult zien dat de volgorde van de lijst verschilt. Deze functie is niet noodzakelijk voor het functioneren van 4250

- 4250:
Dit is een aangepaste versie van jouw code. Voor het functioneren van deze versie zijn de functies STM-ENTLIST-FILTER en GetPlinePoints noodzakelijk.

Ik hoop dat het zo werkt (ik kan dit zelf niet controleren omdat ik Bricscad 7 gebruik).

Groet, Roy.

netadmin

Heel erg bedankt voor de moeite Roy !
Probleem opgelost. Groeten van onze tekenaar. Die was zeer tevreden.

FastFiber