Function Querry

Function Querry

vishshreevT578L
Advocate Advocate
2,009 Views
11 Replies
Message 1 of 12

Function Querry

vishshreevT578L
Advocate
Advocate

(defun LM:endundo ( doc )
(while (= 8 (logand 8 (getvar 'undoctl)))
(vla-endundomark doc)
)
)

;; Active Document - Lee Mac
;; Returns the VLA Active Document Object

(defun LM:acdoc nil
(eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
(LM:acdoc)
)

 

Hello 

 

can anyone make me understand the above 

Shreev
0 Likes
Accepted solutions (1)
2,010 Views
11 Replies
Replies (11)
Message 2 of 12

Ranjit_Singh
Advisor
Advisor

Vishshreev,  read about logand in AutoCAD documentation. Looking at the first part of code [(defun LM:endundo ( doc ) (while (= 8 (logand 8 (getvar 'undoctl))) (vla-endundomark doc)))] This part of code checks if bit 3 (value 8) is set, which identifies if A group is currently active. If so, set an Undo End by (vla-endundomark doc)

The second part of code retrieves the current active document. You haven't posted the complete code so I don't know where they fit. But , in general, they both will be called in a lisp routine to identify active document and to set undo operations in that document in case an error is encountered.

0 Likes
Message 3 of 12

vishshreevT578L
Advocate
Advocate

;;---------------------=={ Polyline Information }==---------------------;; ;; ;; ;; This program provides the user with detailed information about ;; ;; every segment of a selected polyline in the form of either an ;; ;; AutoCAD Table (if available), Text file, or CSV file. ;; ;; ;; ;; Upon calling the program with the command syntax 'polyinfo' at the ;; ;; AutoCAD command-line, the user is prompted to select an LWPolyline ;; ;; to be queried from the active drawing. At this prompt the user ;; ;; also has the option to choose the form of output for the ;; ;; information harvested by the program; this output format will be ;; ;; remembered between drawing sessions to enable streamlined repeated ;; ;; program usage. ;; ;; ;; ;; The program will output LWPolyline segment data to either an ;; ;; AutoCAD Table Object created in the active drawing (if such object ;; ;; is available in the version of AutoCAD in which the program is ;; ;; being executed), or a tab-delimited Text file or CSV file ;; ;; automatically created (streamlining the program to minimise ;; ;; prompts) in the working directory of the active drawing. ;; ;; ;; ;; For every segment of the selected LWPolyline, the program will ;; ;; extract the following information: ;; ;; ;; ;; • Segment Number ;; ;; • Segment Start Vertex Coordinate ;; ;; • Segment End Vertex Coordinate ;; ;; • Segment Start Width ;; ;; • Segment End Width ;; ;; • Segment Length ;; ;; • Arc Centre (if arc segment) ;; ;; • Arc Radius (if arc segment) ;; ;; ;; ;;----------------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2014 - www.lee-mac.com ;; ;;----------------------------------------------------------------------;; ;; Version 1.0 - 2012-07-10 ;; ;; ;; ;; - First release. ;; ;;----------------------------------------------------------------------;; ;; Version 1.1 - 2012-07-16 ;; ;; ;; ;; - Added Table & Text file output options. ;; ;; - Removed basic LWPolyline properties. ;; ;;----------------------------------------------------------------------;; ;; Version 1.2 - 2014-06-14 ;; ;; ;; ;; - Fixed bug causing final segment to be omitted from output data ;; ;; when processing closed polylines. ;; ;;----------------------------------------------------------------------;; ;; Version 1.3 - 2015-04-13 ;; ;; ;; ;; - Fixed bug causing the program to crash when processing polylines ;; ;; containing arc segments. ;; ;;----------------------------------------------------------------------;; (defun c:polyinfo ( / *error* ent enx flg ins lst out seg tmp ) (defun *error* ( msg ) (LM:endundo (LM:acdoc)) (if (= 'str (type out)) (setenv "LMac\\PolyInfo" out)) (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")) (princ (strcat "\nError: " msg)) ) (princ) ) (if (null (setq out (getenv "LMac\\PolyInfo"))) (setq out "TXT") ) (princ (strcat "\nOutput Format: " (cond ( (= out "TXT") "Text File") ( (= out "CSV") "CSV File") ( "AutoCAD Table" ) ) ) ) (while (progn (setvar 'errno 0) (initget "Output") (setq ent (entsel "\nSelect polyline [Output]: ")) (cond ( (= 7 (getvar 'errno)) (princ "\nMissed, try again.") ) ( (null ent) nil ) ( (= "Output" ent) (polyinfo:chooseoutput 'out) (setenv "LMac\\PolyInfo" out) (princ (strcat "\nOutput Format: " (cond ( (= out "TXT") "Text File") ( (= out "CSV") "CSV File") ( "AutoCAD Table" ) ) ) ) ) ( (/= "LWPOLYLINE" (cdr (assoc 0 (entget (setq ent car ent)))))) (princ "\nSelected object is not an LWPolyline.") ) ) ) ) (cond ( (and (= 'ename (type ent)) (= "Table" out) (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (getvar 'clayer)))))) ) (princ "\nCurrent layer locked.") ) ( (= 'ename (type ent)) (setq seg 0 enx (entget ent) lst (LM:lwvertices enx) lst (cons (append '("SEG." "START X" "START Y" "END X" "END Y" "WIDTH 1" "WIDTH 2" "LENGTH") (if (setq flg (vl-some '(lambda ( x ) (not (zerop (cdr (assoc 42 x))))) lst)) '("CENTRE X" "CENTRE Y" "RADIUS") ) ) (mapcar (function (lambda ( l1 l2 / b p q ) (setq p (cdr (assoc 10 l1)) q (cdr (assoc 10 l2)) b (cdr (assoc 42 l1)) ) (append (list (itoa (setq seg (1+ seg)))) (mapcar 'rtos p) (mapcar 'rtos q) (list (rtos (cdr (assoc 40 l1))) (rtos (cdr (assoc 41 l1))) ) (if (zerop b) (cons (rtos (distance p q)) (if flg '("" "" ""))) (append (list (rtos (abs (* (LM:bulgeradius p q b) (atan b) 4)))) (mapcar 'rtos (LM:bulgecentre p q b)) (list (rtos (LM:bulgeradius p q b))) ) ) ) ) ) lst (if (= 1 (logand 1 (cdr (assoc 70 enx)))) (append (cdr lst) (list car lst))) (cdr lst) ) ) ) ) (cond ( (= out "TXT") (if (LM:writetxt lst (setq tmp (vl-filename-mktemp (cdr (assoc 5 enx)) (getvar 'dwgprefix) ".txt"))) (startapp "explorer" tmp) ) ) ( (= out "CSV") (if (LM:writecsv lst (setq tmp (vl-filename-mktemp (cdr (assoc 5 enx)) (getvar 'dwgprefix) ".csv"))) (startapp "explorer" tmp) ) ) ( (setq ins (getpoint "\nSpecify point for table: ")) (LM:startundo (LM:acdoc)) (LM:addtable (vlax-get-property (LM:acdoc) (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace)) (trans ins 1 0) nil lst nil) (LM:endundo (LM:acdoc)) ) ) ) ) (princ) ) ;; Add Table - Lee Mac ;; Generates a table at the given point, populated with the given data and optional title. ;; spc - [vla] VLA Block object ;; ins - [lst] WCS insertion point for table ;; ttl - [str] [Optional] Table title ;; lst - [lst] Matrix list of table cell data ;; eqc - [bol] If T, columns are of equal width ;; Returns: [vla] VLA Table Object (defun LM:addtable ( spc ins ttl lst eqc / dif hgt i j obj stn sty wid ) (setq sty (vlax-ename->vla-object (cdr (assoc -1 (dictsearch (cdr (assoc -1 (dictsearch (namedobjdict) "acad_tablestyle"))) (getvar 'ctablestyle) ) ) ) ) ) (setq hgt (vla-gettextheight sty acdatarow)) (if (LM:annotative-p (setq stn (vla-gettextstyle sty acdatarow))) (setq hgt (/ hgt (cond ((getvar 'cannoscalevalue)) (1.0)))) ) (setq wid (mapcar '(lambda ( col ) (apply 'max (mapcar '(lambda ( str ) ( (lambda ( box ) (if box (+ (* 2.5 hgt) (- (caadr box) (caar box))) 0.0)) (textbox (list (cons 01 str) (cons 40 hgt) (cons 07 stn) ) ) ) ) col ) ) ) (apply 'mapcar (cons 'list lst)) ) ) (if (and ttl (< 0.0 (setq dif (/ (- ( (lambda ( box ) (if box (+ (* 2.5 hgt) (- (caadr box) (caar box))) 0.0)) (textbox (list (cons 01 ttl) (cons 40 hgt) (cons 07 stn) ) ) ) (apply '+ wid) ) (length wid) ) ) ) ) (setq wid (mapcar '(lambda ( x ) (+ x dif)) wid)) ) (setq obj (vla-addtable spc (vlax-3D-point ins) (1+ (length lst)) (length (car lst)) (* 2.0 hgt) (if eqc (apply 'max wid) (/ (apply '+ wid) (float (length (car lst)))) ) ) ) (vla-put-regeneratetablesuppressed obj :vlax-true) (vla-put-stylename obj (getvar 'ctablestyle)) (setq i -1) (if (null eqc) (foreach col wid (vla-setcolumnwidth obj (setq i (1+ i)) col) ) ) (if ttl (progn (vla-settext obj 0 0 ttl) (setq i 1) ) (progn (vla-deleterows obj 0 1) (setq i 0) ) ) (foreach row lst (setq j 0) (foreach val row (vla-settext obj i j val) (setq j (1+ j)) ) (setq i (1+ i)) ) (vla-put-regeneratetablesuppressed obj :vlax-false) obj ) ;; Write CSV - Lee Mac ;; Writes a matrix list of cell values to a CSV file. ;; lst - [lst] list of lists, sublist is row of cell values ;; csv - [str] filename of CSV file to write ;; Returns T if successful, else nil (defun LM:writecsv ( lst csv / des sep ) (if (setq des (open csv "w")) (progn (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (","))) (foreach row lst (write-line (LM:lst->csv row sep) des)) (close des) t ) ) ) ;; List -> CSV - Lee Mac ;; Concatenates a row of cell values to be written to a CSV file. ;; lst - [lst] list containing row of CSV cell values ;; sep - [str] CSV separator token (defun LM:lst->csv ( lst sep ) (if (cdr lst) (strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep)) (LM:csv-addquotes (car lst) sep) ) ) (defun LM:csv-addquotes ( str sep / pos ) (cond ( (wcmatch str (strcat "*[`" sep "\"]*")) (setq pos 0) (while (setq pos (vl-string-position 34 str pos)) (setq str (vl-string-subst "\"\"" "\"" str pos) pos (+ pos 2) ) ) (strcat "\"" str "\"") ) ( str ) ) ) ;; Write Text File - Lee Mac ;; Writes a matrix of values to a tab-delimited Text file. ;; lst - [lst] list of lists, sublist is line of text values ;; txt - [str] filename of Text file to write ;; Returns T if successful, else nil (defun LM:writetxt ( lst txt / des ) (if (setq des (open txt "w")) (progn (foreach itm lst (write-line (LM:lst->str itm "\t") des)) (close des) t ) ) ) ;; List to String - Lee Mac ;; Concatenates each string in a supplied list, separated by a given delimiter ;; lst - [lst] List of strings to concatenate ;; del - [str] Delimiter string to separate each item (defun LM:lst->str ( lst del ) (if (cdr lst) (strcat (car lst) del (LM:lst->str (cdr lst) del)) (car lst) ) ) ;; Annotative-p - Lee Mac ;; Predicate function to determine whether a Text Style is annotative. ;; sty - [str] Name of Text Style (defun LM:annotative-p ( sty ) (and (setq sty (tblobjname "style" sty)) (setq sty (cadr (assoc -3 (entget sty '("AcadAnnotative"))))) (= 1 (cdr (assoc 1070 (reverse sty)))) ) ) ;; LW Vertices - Lee Mac ;; Returns a list of lists in which each sublist describes ;; the position, starting width, ending width and bulge of the ;; vertex of a supplied LWPolyline (defun LM:lwvertices ( e ) (if (setq e (member (assoc 10 e) e)) (cons (list (assoc 10 e) (assoc 40 e) (assoc 41 e) (assoc 42 e) ) (LM:lwvertices (cdr e)) ) ) ) ;; Bulge Radius - Lee Mac ;; p1 - start vertex ;; p2 - end vertex ;; b - bulge ;; Returns the radius of the arc described by the given bulge and vertices (defun LM:bulgeradius ( p1 p2 b ) (/ (* (distance p1 p2) (1+ (* b b))) 4 (abs b)) ) ;; Bulge Centre - Lee Mac ;; p1 - start vertex ;; p2 - end vertex ;; b - bulge ;; Returns the centre of the arc described by the given bulge and vertices (defun LM:bulgecentre ( p1 p2 b ) (polar p1 (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b)))) (/ (* (distance p1 p2) (1+ (* b b))) 4 b) ) ) ;; Start Undo - Lee Mac ;; Opens an Undo Group. (defun LM:startundo ( doc ) (LM:endundo doc) (vla-startundomark doc) ) ;; End Undo - Lee Mac ;; Closes an Undo Group. (defun LM:endundo ( doc ) (while (= 8 (logand 8 (getvar 'undoctl))) (vla-endundomark doc) ) ) ;; Active Document - Lee Mac ;; Returns the VLA Active Document Object (defun LM:acdoc nil (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object)))) (LM:acdoc) ) (vl-load-com) (eval (append (list 'defun 'polyinfo:chooseoutput '( sym )) (if (vlax-method-applicable-p (vla-get-modelspace (LM:acdoc)) 'addtable) (list '(initget "Table TXT CSV") '(set sym (cond ((getkword (strcat "\nChoose Output [Table/TXT/CSV] <" (eval sym) ">: "))) ((eval sym)))) ) (list '(initget "TXT CSV") '(set sym (cond ((getkword (strcat "\nChoose Output [TXT/CSV] <" (eval sym) ">: "))) ((eval sym)))) ) ) ) ) (princ (strcat "\n:: PolyInfo.lsp | Version 1.3 | \\U+00A9 Lee Mac " (menucmd "m=$(edtime,0,yyyy)") " www.lee-mac.com ::" "\n:: Type \"polyinfo\" to Invoke ::" ) ) (princ) ;;----------------------------------------------------------------------;; ;; End of File ;; ;;----------------------------------------------------------------------;; (c:polyinfo)

Shreev
0 Likes
Message 4 of 12

vishshreevT578L
Advocate
Advocate
When will be the sys variable of undoctl to 8
Shreev
0 Likes
Message 5 of 12

vishshreevT578L
Advocate
Advocate
When will be the sys variable of undoctl to 8
Shreev
0 Likes
Message 6 of 12

Ranjit_Singh
Advisor
Advisor
Accepted solution

undoctl is a read-only  variable. You cannot set it using (setvar 'undoctl 61) It will change values according to your undo actions. Type (getvar 'undoctl), the default value should be 53. Now, start undo command and call begin. Now that you have activated a group of commands that is waiting for an end undo mark, call (getvar 'undoctl), the value is 61. Now, type undo command again and end. Call (getvar 'undoctl) the value is now back to 53. Hope this clears things up for you.

 

Command: (getvar 'undoctl)
53
Command: UNDO Current settings: Auto = On, Control = All, Combine = Yes, Layer = Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back] <1>: begin
Command:
Command: (getvar 'undoctl)
61
Command: UNDO
Current settings: Auto = On, Control = All, Combine = Yes, Layer = Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back] <1>: end
Command:
Command: (getvar 'undoctl)
53
Command: (setvar 'undoctl 61)
; error: AutoCAD variable setting rejected: UNDOCTL 61
0 Likes
Message 7 of 12

vishshreevT578L
Advocate
Advocate
Yes clear....but not that much
Can you please brief me on logand in simple language
Shreev
0 Likes
Message 8 of 12

Ranjit_Singh
Advisor
Advisor

logand is a binary operation. It will return the value of the bits that test true for both (or how many ever integers) you pass as arguments. I will explain with 2 simple numbers

6   - expressed in binary is 0 0 0 0 0 1 1 0

13 - expressed in binary is 0 0 0 0 1 1 0 1

Result -                             0 0 0 0 0 1 0 0  (value 4)

 

log and will test where 1 is matching in both numbers, so the result will be 3rd bit tested true and so value is 4 [ 1st bit 2 to power 0 - 1, 2nd bit 2 to power 1 - 2, 3rd bit 2 to power 2 - 4]

 

Say we use 6 and 15

 

6   - expressed in binary is 0 0 0 0 0 1 1 0

15 - expressed in binary is 0 0 0 0 1 1 1 1

Result -                             0 0 0 0 0 1 1 0  (value 6)

 

Ggoing back to your original query of logand in LeeMac code undoctl has following values

0 UNDO is turned off
1 UNDO is turned on
2 Only one command can be undone
4 Auto is turned on
8 A group is currently active
16 Zoom and pan operations are grouped as a single action
32 Layer property operations are grouped as a single action

 

Different combination of the above can be true at any given time, so for instance if 8 and 16 are active together then the value is 24. Similarly if 8 and 4 are active then the value is 12. Irrespective of the combination logand will verify if bit 3 is activated (value 8)

 

You can test different combinations from the above 7 values [0, 1, 2, 4, 8, 16, 32] to verify that anytime 8 is factored in then (= 8 (logand 8 (getvar 'undoctl))) will return T otherwise nil

Command: (logand 8 0); UNDO turned off
0
Command: (logand 8 12); 8 and 4 value activated
8
Command: (logand 8 24); 8 and 16 activated
8
Command: (logand 8  61); all activated except value 2
8
Command: (logand 8  63); all activated
8
Command: (logand 8  55); all activated except 8
0

The above are just for example purposes; under what settings they will be true is a different question. To answer in short, the code (= 8 (logand 8 (getvar 'undoctl))) is testing if bit 3 is activated (value 8) and returning T so that vla-endundomark can be called

 

0 Likes
Message 9 of 12

Kent1Cooper
Consultant
Consultant

@vishshreevT578L wrote:
Yes clear....but not that much
Can you please brief me on logand in simple language

Some people have found this very helpful, and some not -- I hope maybe you will.

Kent Cooper, AIA
0 Likes
Message 10 of 12

john.uhden
Mentor
Mentor
IMO. it's not just in case of errors. We should use undomarks to permit the user to Undo the command we created. Imagine creating a command function that repeatedly calls (command ...) or (vl-cmdf ...)? I certainly don't want to keep hitting "U" for each one.

I also don't think we need to check for the value of Undoctl. (vla-startundomark) will begin a group and (vla-endundomark) will end it. Near the beginning of all my command functions I call (vla-endundomark) followed immediately by (vla-startundomark). Of course the code ends with (vla-endundomark) especially within the local *error* function.

John F. Uhden

0 Likes
Message 11 of 12

dbroad
Mentor
Mentor

@vishshreevT578L,

Even if another newsgroup member asks you to post code, you should not posting copyrighted code written by someone else without that author's explicit permission.  The concepts of logand and undo grouping are possible to discuss without such unauthorized postings.  When someone copyrights his coded they are reserving the sole right to such public postings.

 

The author of the code(Lee Mac) apparently thought it important to group the code in such a way that a single undo or a logical number of undos would undo all of the parts of the program.  The endundo program was thoughtfullly written to continue adding endundo marks until all undo groupings were closed.  The document program was thoughtfully written to store the value so execution would only occur once.  The other responders have explained well enough the role of logand.

Architect, Registered NC, VA, SC, & GA.
0 Likes
Message 12 of 12

vishshreevT578L
Advocate
Advocate
It is an open code on sir lee mac site...well i did not used his code and
mentioned my name....there are such programmers who takes the code and ends
with just printing there names...
I hope i have mentioned his privacy
Shreev
0 Likes