Maverik123 Posted November 16, 2021 Posted November 16, 2021 I am a beginner in autocad lisp. I tried to create one program by browsing various topics and Internet search. I want to plot automatically based block definition. We use an, a3 title blocks as blocks in autocad. I want to use this definition and plot. Below is the code It is giving me error: bad function. Can someone please help me to resolve this issue?? (defun C:PLOTME () (if (setq ss (ssget "_X" '(0 . "INSERT") (2. "A4-STD"))) (progn (setq i 0) (while setq ent (ssname ss (setq i (1+ i))) (setq e (entget ss1)) (setq pt1 (cdr (assoc 10 e))) (setq xval (rtos (car pt1) 2)) (setq yval (rtos (cadr pt1) 2)) (setq zval (rtos (caddr pt1) 2)) (setq pt2 '(xval yval)) (setq xval (1000+ xval)) (setq yval (1000+ yval)) (setq pt3 '(xval yval)) (command "plot" "Y" "MODEL" "PDFCreator" "A4" "Millimeters" "Portrait" "No" "Window" pause pause "FIT" "center" "Y" "DDSHIPCON 2018.ctb" "Y" "N" "N" "N" "Y") ); while );progn ); if ); end function Quote
rlx Posted November 16, 2021 Posted November 16, 2021 (edited) Welcome on CadTutor check your ssget , your filter should be (setq ss (ssget "_X" '((0 . "INSERT") (2. "A4-STD")))) both your 0 and 2 group should be in a list Edited November 16, 2021 by rlx Quote
Steven P Posted November 16, 2021 Posted November 16, 2021 (edited) a couple of other things to look at as well...... I might be wrong with this but this version works better on my CAD - compare RLX and my offerings to your version to see the changes. (defun C:PLOTME ( / ) (if (setq ss (ssget "_X" '((0 . "INSERT")(2 . "A4-STD")))) (progn (setq i -1) ;;start at -1 so it becomes 0 at next line (while (setq ent (ssname ss (setq i (1+ i))) ) ;;bracket needed before setq and at end of setq details (setq e (entget ent)) ;;ss1 didn't exist (setq pt1 (cdr (assoc 10 e))) (setq xval (rtos (car pt1) 2)) (setq yval (rtos (cadr pt1) 2)) (setq zval (rtos (caddr pt1) 2)) (setq pt2 (list xval yval)) ;;using list here a ' will just put in exactly as you type, list will evaluate what is there (setq xval (rtos (+ 1000 (atof xval)))) ;;xval, yval are texts from rtos above, change to numbers and back to text (setq yval (rtos (+ 1000 (atof yval)))) (setq pt3 (list xval yval)) (command "plot" "Y" "MODEL" "PDFCreator" "A4" "Millimeters" "Portrait" "No" "Window" pause pause "FIT" "center" "Y" "DDSHIPCON 2018.ctb" "Y" "N" "N" "N" "Y") ;;and you don't use your points here!! ); while );progn ); if ); end function Edited November 16, 2021 by Steven P Corrected code Quote
BIGAL Posted November 17, 2021 Posted November 17, 2021 You say use a A3 title block then choose a A4 size ? Also depending on pdf device "Iso full bleed A3 (420.00 x 297.00 MM)" this is correct description of a A3 sheet. Another suggestion if your title block is in layouts then use something like this it will plot all or a range of layouts for you. Its setup for a A1 title block plotting to a A3. ;Plots layouts by range ; By Alan H Feb 2014 (defun AH:pltlays ( / lay numlay numend) (SETVAR "PDMODE" 0) (setvar "fillmode" 1) (setvar "textfill" 1) (setq alllays (vla-get-Layouts (vla-get-activedocument (vlax-get-acad-object)))) (setq count (vla-get-count alllays)) (if (not AH:getvalsm)(load "Multi Getvals.lsp")) (setq vals (AH:getvalsm (list "Enter plot range" "Enter start tab number" 6 4 "1" "Enter end tab number" 6 4 (RTOS COUNT 2 0)))) (setq numlay (atoi (nth 0 vals))) (setq numend (atoi (nth 1 vals))) (setq len (+ (- numend numlay) 1)) (setq dwgname (GETVAR "dwgname")) (setq lendwg (strlen dwgname)) (setq dwgname (substr dwgname 1 (- lendwg 4))) (repeat len (vlax-for lay alllays (if (= numlay (vla-get-taborder lay)) (setvar "ctab" (vla-get-name lay)) ) ; if (setq pdfname (strcat (getvar "dwgprefix") "pdf\\" dwgname "-" (getvar "ctab"))) ) ; for (setq lay nil) (setvar "textfill" 1) (setvar "fillmode" 1) (COMMAND "-PLOT" "Y" "" "DWG To PDF" "Iso full bleed A3 (420.00 x 297.00 MM)" "m" "LANDSCAPE" "N" "W" "-6,-6" "807,560" "1=2" "C" "y" "Acad.ctb" "Y" "n" "n" "n" pdfName "N" "y" ) (setq numlay (+ numlay 1)) ) ; end repeat ) ; defun (AH:pltlays) Multi GETVALS.lsp Quote
Maverik123 Posted November 17, 2021 Author Posted November 17, 2021 Dear gents, Thanks for your reply. I changed the code considerably doing some research. Pfb modified code (defun C:PLOTME () (setq n (getint "\nEnter Number of Steps : ")) (if (setq ss (ssget "x" '((0 . "insert") (2 . "A4-STD")))) (progn (repeat n (setq i (sslength ss)) (setq px (cdr (assoc 10 (entget (ssname ss (setq i (1- i))))))) (setq pt2 (list (car px) (cadr px))) (setq aa (atof (rtos (car px) 2))) (setq bb (atof (rtos (cadr px) 2))) (setq nx (+ aa 1000)) (setq ny (+ bb 1000)) (setq pt3 (list nx ny)) (command "plot" "Y" "MODEL" "PDFCreator" "A4" "Millimeters" "Portrait" "No" "Window" sp1 sp2 "FIT" "center" "Y" "DDSHIPCON 2018.ctb" "Y" "N" "N" "N" "Y") (PRINC) ); repeat );progn I am still not able to crack it. It is giving following error Enter a layout name or [?] <Model>: MODEL Enter an output device name or [?] <None>: PDFCreator Enter paper size or [?] <A4>: A4 Enter paper units [Inches/Millimeters] <Inches>: Millimeters Enter drawing orientation [Portrait/Landscape] <Landscape>: Portrait Plot upside down? [Yes/No] <No>: No Enter plot area [Display/Extents/Limits/View/Window] <Display>: Window Enter lower left corner of window <0.000000,0.000000>: Command: Command: FIT Unknown command "FIT". Press F1 for help. Command: center Unknown command "CENTER". Press F1 for help. Command: Y Unknown command "Y". Press F1 for help. Command: DDSHIPCON 2018.ctb Unknown command "CTB". Press F1 for help. Command: Y Unknown command "Y". Press F1 for help. Command: N Unknown command "N". Press F1 for help. Command: N Unknown command "N". Press F1 for help. Command: N Unknown command "N". Press F1 for help. Command: Y Unknown command "Y". Press F1 for help. This means points sp1 and sp2 is null. I tried to use prompt and print all values, it is giving me error " bad argued type: string 34372.0" This 34372 is x value of the first block. I am not sure how to correct it. Please note above is only for testing purpose. Idea is to use block coordinates and define two points for Window plot. I will add addition and subtraction to this block coordinates to get the desired points. Once I get desired point, I will use them in plot, so as to get correct plot I want. Any help is greatly appreciated. Thanks a lot for educating me Quote
Maverik123 Posted November 17, 2021 Author Posted November 17, 2021 Finally some meaningful results. Thanks guys for your time (defun C:PLOTME () (setq n (getint "\nEnter Number of Steps : ")) (if (setq ss (ssget "x" '((0 . "insert") (2 . "A4-STD")))) (progn (setq i -1) (repeat n (setq px (cdr (assoc 10 (entget (ssname ss (setq i (1+ i))))))) (setq aa (atof (rtos (car px) 2 4))) (setq bb (atof (rtos (cadr px) 2 4))) (setq nx (rtos (- aa 34355.3919) 2 4)) (setq ny (rtos (- bb 77165.1662) 2 4)) (setq mx (rtos (- aa 2855.3919) 2 4)) (setq my (rtos (- bb 32576.5481) 2 4)) (setq sp2 (strcat nx "," ny)) (setq sp3 (strcat mx "," my)) (princ sp2) (princ sp3) (command "plot" "Y" "MODEL" "PDFCreator" "A4" "Millimeters" "Portrait" "No" "Window" sp2 sp3 "FIT" "center" "Y" "DDSHIPCON 2018.ctb" "Y" "N" "N" "N" "Y") (PRINC) ); repeat );progn );if (princ) ); end function 1 Quote
Steven P Posted November 17, 2021 Posted November 17, 2021 I'll get in here quick - someone else will - if you put your future code in between the code tags that gives it the grey background and is a bit easier to read - code tags, click the <> button above in the message header and paste in the pop up box. Glad it is all working Quote
BIGAL Posted November 17, 2021 Posted November 17, 2021 (edited) If the title block is in layouts go back and have a look at what I posted, it can plot like start at layout3 till layout 5. You just need to change the code to match the correct plotter name, size ctb, scale etc. Does not need "Model" Edited November 17, 2021 by BIGAL Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.