All Activity
- Today
-
Function to calculate Mtext Justification based on Rotation
GLAVCVS replied to CivilTechSource's topic in AutoLISP, Visual LISP & DCL
I think you've solved the problem very well. In response to your request for improvements or suggestions, I've provided some minor modifications below that, in my opinion, make the command more intuitive. (defun c:LE-CalExtFFL ( / pt1 pt2 pt3 TxtRotation TxtJustification radians degrees) (command "_layer" "_m" "-LE-E-External Levels" "") (setq Prefix "") (setq Suffix "") (setq ffl-ent (car (entsel))) (if (and ffl-ent (= (cdr (assoc 0 (entget ffl-ent))) "MTEXT")) (progn ;; Get the MText object and extract text content (setq ffl-obj (entget ffl-ent)) (setq ffl-text (cdr (assoc 1 ffl-obj))) (princ (strcat "\nFFL Text found: " ffl-text)) (setq ffl-value (ExtractFFLValue ffl-text)) (princ "\nSelect points where to place the level text (Press Enter to finish): ") (if ffl-value (if (setq pt1 (getpoint "\nSelect first point: ")) (if (setq pt2 (getpoint pt1 "\nSelect second point: ")) (virtualiza) ) ) ) ) ) ) (defun virtualiza (/ para grd mto) (princ "\nMove the mouse to decide justification...") (while (and (not para) (setq grd (grread nil 13 0)) (listp (cadr grd))) (setq pt3 (cadr grd)) (setq SpotLevel (- ffl-value 0.15)) ;; Initialize point list ;; Prompt for points where to place the new MText (setq TxtRotation (angle pt1 pt2)) (setq TxtValue SpotLevel) (DefMTextJustification pt1 pt2 pt3) (if mto (entmod (subst (cons 71 TxtJustification) (assoc 71 (entget mto)) (entget mto))) (setq mto (CreateMText pt1 TxtValue TxtRotation TxtJustification)) ) (if (= (car grd) 3) (setq para T)) ) ) (defun ExtractFFLValue (text-string / clean-text) (if (> (strlen text-string) 5) ;Charcters Removed from String (setq clean-text (substr text-string 6)) (setq clean-text text-string) ) (if (numberp (read clean-text)) (read clean-text) (progn (princ "\nError: Could not extract numeric value from FFL text.") nil ) ) ) (defun DefMTextJustification ( p1 p2 p3 / ) ;; Top Left = 1 ;; Top Center = 2 ;; Top Right = 3 ;; Middle Left = 4 ;; Middle Center = 5 ;; Middle Right = 6 ;; Bottom Left = 7 ;; Bottom Center = 8 ;; Bottom Right = 9 (if (or (and (>= (angle p1 p2) 0.0) (<= (angle p1 p2) 1.570796327)) (>= (angle p1 p2) 4.71238898)) (progn (setq TxtJustification 1) (setq Prefix "+") (setq Suffix "") (if (> (angle p1 p3) (angle p1 p2)) (progn (setq TxtJustification 7) (setq Prefix "+") (setq Suffix "") (if (and (= (angle p1 p2) 0.0) (> (angle p1 p3) 4.71238898)) (progn (setq TxtJustification 1) (setq Prefix "+") (setq Suffix "") ) ) ) ) ) (progn (setq TxtJustification 3) (setq Prefix "") (setq Suffix "+") (setq TxtRotation (+ TxtRotation pi)) ;;Set Justification to Bottom (if (> (angle p1 p3) (angle p1 p2)) (progn (setq TxtJustification 3) (setq Prefix "") (setq Suffix "+") ) (progn (setq TxtJustification 9) (setq Prefix "") (setq Suffix "+") ) ) ) ) ) (defun CreateMText ( point txtvalue txtrot txtjust / txtjust txtrot mtext-obj) (setq mtext-obj (entmakex (list (cons 0 "MTEXT") (cons 100 "AcDbEntity") (cons 8 (getvar "CLAYER")) ; Current layer (cons 100 "AcDbMText") (cons 10 point) ; Insertion point (cons 40 0.5) ; Text height (adjust as needed) (cons 41 0.0) ; Reference rectangle width (cons 71 txtjust) (cons 72 5) ; Drawing direction (cons 1 (strcat Prefix (rtos txtvalue 2 3) Suffix)) ; Text content with "+" prefix (cons 50 txtrot) ; Rotation angle ) ) ) mtext-obj ) -
Attributes be added to factor the outcome of Incremental numbers
SLW210 replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
Just post a link to the other thread as a reference. Other thread for reference... -
Attributes be added to factor the outcome of Incremental numbers
u4ea2u2 replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
The other thread (page 1) is the source of Lee mac's code and Terry.T's addition to select block to receive the incremental numbers. Admin moved this request to this new thread. After realized this I posted same thing here. Sorry for the confusion. Adm can delete my request there if needed. From the original code ( assigns incremental numbers to a Port_Number attribute of all instance of one block) I'm wondering if 2 things can happen: 1st of multiple instance of one block, if matching attribute values in a Part_Number attribute exists in 2 or more blocks, those blocks receive the same or matching incremental number in their Port_Number attribute. 2nd is the code decides, when assigning incremental numbers, the order of those numbers to which blocks receive a # based on priority levels from 3 attributes. Sort_Order is attribute 1st priority. If values match in Sort_Order the code looks to Sort_Order2's attribute value. If they match there also then the code looks to Sort_Order3's value before assigning incremental numbers. Attached is a cleaner file to test. Blocks (been exploded) on the left "example" is the end result. Blocks on the right one can test code on them. hope this helps. Thanks PNO TEST-LSP FOR NUMBING4.dwg -
Dynamic Block w/Rotation and Stretch
ahmad34 replied to Bill Tillman's topic in AutoCAD Drawing Management & Output
Thanks for sharing Datvo -
You can't use two visibility parameters in the same dynamic block. — What if I want to switch between dimensions and versions? — The most common approach is to create a combined visibility state, such as "A1 - Bidding Version" or "A1 - Construction Version." — Does that sound like more states to manage? — Yes, it's more cumbersome, but this is a limitation of AutoCAD dynamic blocks. If you want more flexibility, consider using a lookup table or attribute field.
-
Please have a look at this, it makes a rectang then you can add the "TAB" to any side, even on an angle. The red points are the pick points working in a clock wise direction, if you pick wrong end the TAB will go inwards. I made a Block called " TAB" and used your dwg to set the edge distances. I did adjust the block ever so slightly it had like 33.70123 so set it to 33.7. here is also your dwg with the TAB block added. If your happy will add the Squares, again based on the rectang size. (defun c:wow ( / oldsnap pt1 pt2 pt3 pt4 ang tabwid) (setq oldsnap (getvar 'osmode)) (setq oldang (getvar 'aunits)) (setq ht 800.0 tabedge 41.0 tabwid 33.7) (setq pt1 (getpoint "\nPick 1st point ")) (setq len (getdist pt1 "\nPick 2nd point ")) (setq pt2 (mapcar '+ pt1 (list len 0.0 0.0)) pt3 (mapcar '+ pt1 (list len ht 0.0)) pt4 (mapcar '+ pt1 (list 0.0 ht 0.0)) ) (setvar 'osmode 0) (setvar 'aunits 3) (command "Line" pt1 pt2 pt3 pt4 "c") (while (setq ent (entsel "\nPick near start end - Enter to stop ")) (setq ept (cadr ent)) (setq ent (car ent)) (setq entg (entget ent)) (setq start (cdr (assoc 10 entg))) (setq end (cdr (assoc 11 entg))) (setq len2 (distance start end)) (setq d1 (distance ept start)) (setq d2 (distance ept end)) (if (> d1 d2) (progn (setq temp start) (setq start end) (setq end temp) ) ) (setq ang (angle start end)) (setq pt5 (polar start ang tabedge)) (setq pt6 (polar pt5 ang tabwid)) (command "break" ent pt5 pt6) (command "insert" "TAB" pt5 1 1 ang) (command "explode" (entlast)) (setq pt5 (polar start ang (- len2 tabwid tabedge ))) (setq pt6 (polar pt5 ang tabwid)) (command "break" ent pt5 pt6) (command "insert" "TAB" pt5 1 1 ang) (command "explode" (entlast)) ) (setq pt3 (mapcar '+ pt3 (list 40 40 0.0))) (setq pt1 (mapcar '+ pt1 (list -40 -40 0.0))) (command "join" "w" pt3 pt1 "") (setvar 'osmode oldsnap) (setvar 'aunits oldang) (princ) ) (c:wow) The array does have a pattern so your multi if's could become as simple, as (fix (- (/ length 75) 1)) just try it. Vertical rows is 9 for 800. (setq col (fix (- (/ 1220.234 75) 1))) (setq bname (strcat "*Infil_sq_" (rtos col 2 0))) Is the length overall or the distance between the centre points of the slots. Can fix length to match. Need you to confirm what this length is based on. Infil Panels AutoLisp Test-TAB.dwg
-
I still think much easier to just select a line or pline near an end, then draw the tab based on some sort of sizes criteria, after doing the code i realised only really need one draw tab portion so can be on any segment and a bonus at any angle of the selected P/Line. The tab would be drawn and a simple flip to set it to inside or outside. You can pick say 4 times very fast. Even shapes would work. Why not just have the tab as a block, much easier to work with. Will have a think about it. Oh yeah I think the infill can be done as an array rather than having lots of blocks. Found your post over at forums/autodesk as well.
-
Attributes be added to factor the outcome of Incremental numbers
BIGAL replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
You should remove your other post. It is confusing to have two posts. I sorted all the blocks in that dwg. Still not sure your criteria for changing which attribute value. (("DATAPORT NUMBER" "APPLE" "" "1200" "1" "") ("DATAPORT NUMBER" "Box" "" "1250" "" "") ("DATAPORT NUMBER" "Box" "" "1250" "" "") ("DATAPORT NUMBER" "CHERRY" "" "1200" "001" "Yesterday") ("DATAPORT NUMBER" "Cheeze" "" "1800.9" "1" "Now") ("DATAPORT NUMBER" "Chocolates" "" "1350" "" "") ("DATAPORT NUMBER" "DD3" "" "1000" "001" "") ("DATAPORT NUMBER" "Milk" "" "1700" "1" "Never") ("DATAPORT NUMBER" "Milk" "" "1700" "1" "Never") ("DATAPORT NUMBER" "PEACH" "" "1200" "001" "Tomorrow") ("DATAPORT NUMBER" "PEACH" "" "1200" "001" "Tomorrow") ("DATAPORT NUMBER" "PEAR" "" "1200" "001" "Tomorrow") ("DATAPORT NUMBER" "PIE" "" "1100" "003" "") ("DATAPORT NUMBER" "PIE" "" "1100" "003" "") ("DATAPORT NUMBER" "Picles" "" "1400" "" "") ("DATAPORT NUMBER" "Yogurt" "" "1800.9" "2" "")) -
Attributes be added to factor the outcome of Incremental numbers
BIGAL replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
I posted elsewhere about sorting attributes say up to 5 attributes deep and a list Is made, the next step is the list is counted so the same block attributes have a count added. Eg (002 1100 001 3) so 3 the same exists. Your other post ? So in your data you have say 2 x Box, milk, peach and so on. So what do you do to fix ? (("DATAPORT NUMBER" "APPLE" "" "1200" "1" "") ("DATAPORT NUMBER" "Box" "" "1250" "" "") ("DATAPORT NUMBER" "Box" "" "1250" "" "") ("DATAPORT NUMBER" "CHERRY" "" "1200" "001" "Yesterday") ("DATAPORT NUMBER" "Cheeze" "" "1800.9" "1" "Now") ("DATAPORT NUMBER" "Chocolates" "" "1350" "" "") ("DATAPORT NUMBER" "DD3" "" "1000" "001" "") ("DATAPORT NUMBER" "Milk" "" "1700" "1" "Never") ("DATAPORT NUMBER" "Milk" "" "1700" "1" "Never") ("DATAPORT NUMBER" "PEACH" "" "1200" "001" "Tomorrow") ("DATAPORT NUMBER" "PEACH" "" "1200" "001" "Tomorrow") ("DATAPORT NUMBER" "PEAR" "" "1200" "001" "Tomorrow") ("DATAPORT NUMBER" "PIE" "" "1100" "003" "") ("DATAPORT NUMBER" "PIE" "" "1100" "003" "") ("DATAPORT NUMBER" "Picles" "" "1400" "" "") ("DATAPORT NUMBER" "Yogurt" "" "1800.9" "2" "")) -
Thank you for your advice
-
Thank you very much. That works perfectly
-
You can null these 2 defuns
- Yesterday
-
Break an object at 2 points and replace the properties of the line
GLAVCVS replied to Nikon's topic in AutoLISP, Visual LISP & DCL
The user can always activate the object snapping option using F3. The reason I left this option is in case the user ever needs to reference the geometry of other nearby objects. -
devitg started following Autocad join command and Break an object at 2 points and replace the properties of the line
-
Break an object at 2 points and replace the properties of the line
devitg replied to Nikon's topic in AutoLISP, Visual LISP & DCL
Why not use (setvar 'osmode 512) ; as per NEAREST (setq pt1 (getpoint "\nSelect the first break point: ") ;; Entering the first break point pt2 (getpoint "\nSelect the second break point: ") ;; Entering the second break point ep nil ) So point will be at select entity and not need to get the closestpoint (setq pt1 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent) pt1) pt2 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent) pt2) ) -
use this PEDIT WAY (command "._PEDIT" topline "_J" "all" "" "" ) ;topline infilHL bottomline infilHR "" "_j" "" "")
-
Please upload this defun (savevartoold) (infilpanellayer)
-
Read up on cond. better way to test/decide what block to insert. (cond ((and (>= dist1 145) (< dist1 220)) (command "-insert" "*Infil_sq_1" p7 "" "" "") ) ((and (>= dist1 220) (< dist1 295)) (command "-insert" "*Infil_sq_2" p7 "" "" "") ) ((and (>= dist1 295) (< dist1 370)) (command "-insert" "*Infil_sq_3" p7 "" "" "") ) ... ((and(>= dist1 1195) (< dist1 1270)) (command "-insert" "*Infil_sq_15" p7 "" "" "") ) (T ;if all other condtions fail (alert "\nDistance Greater than 1270") ) )
-
Hi All. This time I have included my files to give you a better idea of what i'm trying to acheive Thanks for the ideas. I have used the PEDIT approach and it has almost worked. It joins 3 of the entities but not the 4th. The program runs right through. Any ideas why the 4th entity won't join?? Ive included my DWG file for you to have a look and also my lisp routine. The bulk of the routine works well its just the join command Regards tony Horozontal Infil.lsp Infil Panels AutoLisp Test.dwg
-
u4ea2u2 started following Attributes be added to factor the outcome of Incremental numbers
-
Attributes be added to factor the outcome of Incremental numbers
u4ea2u2 replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
I got to thinking.. if blocks represent parts and multiple similar Parts exists the same assigned number should be same for similar parts. So after adding Part_Number attribute could the lisp runs the below results? (graphically like column order in a table, but the way the order lisp sorts). I see issues if Part_Number and other Sort Orders values don't match when hoping for blocks with same part number to be assigned same Dataport Number. So there would need to be a warning if that occurs. Hope this makes sense. DATAPORT_NUMBER --> order by--> | Sort_Order | Sort_Order2 | Sort_Order3 | <--Part_Number "001" --> "1000" "001" "" <-- "DD3" "002" -->"1100" "003" "" <-- "PIE" "002" -->"1100" "003" "" <-- "PIE" "003" -->"1200" "1" "" <-- "APPLE" "004" -->"1200" "001" "Tomorrow" <--"PEAR" "005" --> "1200" "001" "Tomorrow"<--"PEACH" "005" -->"1200" "001" "Tomorrow" <--"PEACH" "006" -->"1200" "001" "Yesterday" <--"CHERRY" "007" -->"1250" "" "" <--Box "007" -->"1250" "" "" <--Box "008"-->"1350" "" "" <- Chocolates "009" -->"1400" "" "" <--Pickles etc PNO TEST-LSP FOR NUMBING3.dwg -
Attributes be added to factor the outcome of Incremental numbers
u4ea2u2 replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
I got to thinking.. if blocks represent parts and multiple similar Parts exists the same assigned number should be same for similar parts. So after adding Part_Number attribute could the lisp runs the below results? (graphically like column order in a table, but the way the order lisp sorts). I see issues if Part_Number and other Sort Orders values don't match when hoping for blocks with same part number to be assigned same Dataport Number. So there would need to be a warning if that occurs. Hope this makes sense. DATAPORT_NUMBER --> order by--> | Sort_Order | Sort_Order2 | Sort_Order3 | <--Part_Number "001" --> "1000" "001" "" <-- "DD3" "002" -->"1100" "003" "" <-- "PIE" "002" -->"1100" "003" "" <-- "PIE" "003" -->"1200" "1" "" <-- "APPLE" "004" -->"1200" "001" "Tomorrow" <--"PEAR" "005" --> "1200" "001" "Tomorrow"<--"PEACH" "005" -->"1200" "001" "Tomorrow" <--"PEACH" "006" -->"1200" "001" "Yesterday" <--"CHERRY" "007" -->"1250" "" "" <--Box "007" -->"1250" "" "" <--Box "008"-->"1350" "" "" <- Chocolates "009" -->"1400" "" "" <--Pickles etc PNO TEST-LSP FOR NUMBING3.dwg -
Attributes be added to factor the outcome of Incremental numbers
SLW210 replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
I created a new post for this topic. Attributes be added to factor the outcome of Incremental numbers. -
Break an object at 2 points and replace the properties of the line
Nikon replied to Nikon's topic in AutoLISP, Visual LISP & DCL
@GLAVCVS Thank you very much, as always, you are very attentive to details. It is very convenient that the functions work in a loop and a dashed line is created immediately. "But in the end, I decided to spend a little time improving the code". The code has been improved by 100 percent! -
Attributes be added to factor the outcome of Incremental numbers
u4ea2u2 replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
Yes.. the layout you show is what I was thinking of. Attached here is the PNO lisp from earlier in this thread that I was hoping could be altered to do that. Thanks pno.LSP - Last week
-
Attributes be added to factor the outcome of Incremental numbers
u4ea2u2 replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
Thanks Bigal for looking into this. The goal is to have incremental number input into Attribute "Port_Number" based on level of priority..Sort_Order then Sort_Order2 then Sort_order3. The first and second attributes would always have a value, but the third attribute may at time be empty. Ideally when many blocks that share the same values in the 1st 2 attributes, the lisp looks to the 3rd for direction for the next incremental number assignment. -
Attributes be added to factor the outcome of Incremental numbers
BIGAL replied to u4ea2u2's topic in AutoLISP, Visual LISP & DCL
To Admin this is really a new task, as its the posters first post. Does not match this post. You can sort multiple attributes in a order of attributes. I have some thing that works for up to 5 attributes deep. It pads missing attrbute values, so can have say 1 or up to 4 attribute values. I need some time to have a look at say add a "002" block and find highest attribute value of existing blocks. ("DATAPORT NUMBER" "001" "1000" "001" "") ("DATAPORT NUMBER" "002" "1200" "002" "") ("DATAPORT NUMBER" "002" "1200" "002" "Tomorrow") ("DATAPORT NUMBER" "002" "1200" "002" "Yesterday") ("DATAPORT NUMBER" "003" "1200" "001" "") ("DATAPORT NUMBER" "004" "1350" "" "") ("DATAPORT NUMBER" "005" "1400" "" "") ("DATAPORT NUMBER" "006" "1500" "" "") ("DATAPORT NUMBER" "007" "1600" "" "") ("DATAPORT NUMBER" "008" "1700" "" "") ("DATAPORT NUMBER" "009" "1800.9" "" "") ("DATAPORT NUMBER" "010" "1900" "" ""))