Sheep Posted November 25, 2019 Posted November 25, 2019 Hi to all. This is my first post and i'm new at LISP. I need help to make a LISP for AC/DC lane base on user input. 1. User will enter nos of lane 2. Width of the lane. 3. Values for Lm, Tm, Ld,Td dan R. User need to pick the center line (red) and the existing lane (green) to get the R (radius). As you can see, LM@Ld starts at the end of the R and at the end of Lm@Ld will start the tapper ( Tm@Td). Again, im new at LISP and the only thing i can make won my own is this this. But the width is fixed and not based on user input. Thank you for your time and replies. Quote (Defun C:yy ( / p1 ob1) (command "offset" 3.65 (setq ob1 (entsel)) (setq p1 (getpoint)) "") (command "offset" 7.30 ob1 p1 "") (command "offset" 10.95 ob1 p1 "") (princ) );defun acdc.dwg Quote
BIGAL Posted November 27, 2019 Posted November 27, 2019 (edited) For those here not civil engineers you want acceleration and deceleration lanes automated. ok there are a few solutions where I come from the lanes have radius also rather than just a angle line. Its not to hard a question to answer. But there are some issues if the road is within a curve then it becomes way more complicated. Before starting any code really need the Highway code for the task its no good doing something then changing it multiple times. Most of the rules are speed dependant. Edited November 27, 2019 by BIGAL Quote
Sheep Posted November 27, 2019 Author Posted November 27, 2019 (edited) 1 hour ago, BIGAL said: Before starting any code really need the Highway code for the task its no good doing something then changing it multiple times. Most of the rules are speed dependant. Thank you for your reply. Actually Lm, Tm, Ld,Td dan R are from the Highway code and design. Yes, i do know curved alligment will become too much to code, that's why i leave it aside. Most of the AC/DC in the project are not curvy so a quick editing after it was automated can save plenty of time. Edited November 27, 2019 by Sheep typo Quote
BIGAL Posted November 28, 2019 Posted November 28, 2019 (edited) Ok lets look at it for me its look at the steps for you write them down and then we convert to lisp. I will get you started its a good learning example. Pick white line offset left and right pick red line offset say right will come back to left later Offset white roadwidth + Rad + ld -td Offset white roadwidth + Rad + ld Fillet using rad offset lines draw taper line using intersecting points trim up ok now do left side of Tee Now do top side using same ideas. As you make new lines you remember them (setq ent5 (entlast)) so you can do (command "fillet" "R" rad ent5 ent6) Ok found 1st problem your dwg is not true 90 a real world case so even though I outlined above would now look at a different approach why not use points to make line work. Using the polar command you know the two critical lines and there angles Lastly thinking a bit more probably a combination of the two methods. I often throw away and do again realising a much better way to do. Its about converting what you do manually Using polar command work out points 4-8 draw lines and fillet. (setq pt1 (getpoint "Pick intersection point")) (setq pt2 (getpoint "Pick end main road")) (setq pt1 (getpoint "Pick end tee road")) (setq ang1 (angle pt1 pt2)) (setq ang2 (angle pt1 pt3)) (setq off1 (getreal "enter full offset distance lane+widening")) (setq off2 (getreal "enter Tee road lane width")) .... enter rad td ld use polar to work out pt4 pt5 pt6 pt7 pt8 line pt4 pt5 pt6 line pt7 pt8 fillet ent1 ent2 Last put a front end on it Edited November 28, 2019 by BIGAL Quote
Sheep Posted November 28, 2019 Author Posted November 28, 2019 33 minutes ago, BIGAL said: Ok lets look at it for me its look at the steps for you write them down and then we convert to lisp. I will get you started its a good learning example. Pick white line offset left and right pick red line offset say right will come back to left later Offset white roadwidth + Rad + ld -td Offset white roadwidth + Rad + ld Fillet using rad offset lines draw taper line using intersecting points trim up ok now do left side of Tee Now do top side using same ideas. Thank you for your fast reply. Looking at your work here, you have helped many users and i'm glad you help me. Going back to your reply on manual steps, i normally do this: 1. Offset the red line [2] accordingly to the width and nos of lane on both sides. 2. Fillet@Circle ( TTR ) to get the Rad. 3. Get the length of Lm@Ld 4. Construct the tapper [Tm@Td] By using a dialogbox would be great idea. For a,b and c must be in their own layer and linetype and scale (refer to new picture). A.b and c must have min thickness (global width) of 0.3 and max 0.5. I'm sorry for not mentioning about layers and stuff. Again,thank you for your time. I don't know if this will effect anything but i still use Autocad 2007 (yes, it's old) for all my dwg. Quote
BIGAL Posted November 28, 2019 Posted November 28, 2019 2007 s not old, look up Autocad 1.4. The code will run in 2007. Have a go, I started the code for you, don't worry about layers/linetype etc get the shape to work 1st. I would use the point method as I have hinted. Quote
Sheep Posted November 29, 2019 Author Posted November 29, 2019 22 hours ago, BIGAL said: 2007 s not old, look up Autocad 1.4. The code will run in 2007. Have a go, I started the code for you, don't worry about layers/linetype etc get the shape to work 1st. I would use the point method as I have hinted. Thanks for the jump start. I'm new to LISP so i'll surely read plentty of LISP pdf. Again, thanks. Quote
BIGAL Posted November 29, 2019 Posted November 29, 2019 (edited) Look into how polar works bear in mind the angles are in radians but unless you need to enter an angle don't worry about it for this task. A bit of help 90 degs (/ pi 2.0) (setq pt2 (polar pt1 (/ pi 2.0) 22) 180 Pi (setq pt2 (polar pt1 pi 22) 270 (* 1.5 pi) (setq pt2 (polar pt1 (* 1.5 pi) 22) (setq pt2 (polar pt1 (+ (/ pi 2.0) ang) 22) adds 90 to an angle. The dialogue input is in the downloads section here at cadtutor but I would suggest start with (getreal "enter distance" etc Edited November 29, 2019 by BIGAL Quote
Sheep Posted November 29, 2019 Author Posted November 29, 2019 Quick question, can you point to me a good book/link so i can know what setq, polar,getpoint etc? is this correct? Quote (defun c:ACDC ( / pt1 pt2 pt3) (setq pt1 (getpoint "Pick intersection point")) (setq pt2 (getpoint "Pick end main road")) (setq pt3 (getpoint "Pick end tee road")) (command "line" pt1 pt2 pt3 "c") (setq ang1 (angle pt1 pt2)) (setq ang2 (angle pt1 pt3)) ) (princ) Quote
BIGAL Posted November 30, 2019 Posted November 30, 2019 Yes that code is correct so is (setq off1 (getreal "enter full offset distance lane+widening")) (setq off2 (getreal "enter Tee road lane width")) (setq lanewid (getreal "Enter the main road width")) (setq wide (getreal "Enter the widening width")) (Setq p4 (polar p1 ang1 dist1)) ; towards pt2 (setq p4 (polar p4 (- ang1 (/ pi 2.0)) (+ lanewid wide)) ; done twice as must be at 90 degs off line. ; can do a double polar (setq pt4 (polar (polar p1 ........ (setq pt5 ; your turn (command "line pt4 pt5 "") Quote
Sheep Posted December 2, 2019 Author Posted December 2, 2019 On 11/30/2019 at 1:40 PM, BIGAL said: (Setq p4 (polar p1 ang1 dist1)) ; towards pt2 1. Where do i get dist1? I know pt1, p4 and ang1 is from the setq. 2. Below is the code i tried. Quote (defun c:ACDC ( / pt1 pt2 pt3) (setq pt1 (getpoint "Pick intersection point")) (setq pt2 (getpoint "Pick end main road")) (setq pt3 (getpoint "Pick end tee road")) ;;(command "line" pt1 pt2 pt3 "c") (setq ang1 (angle pt1 pt2)) (setq ang2 (angle pt1 pt3)) (setq off1 (getreal "enter full offset distance lane+widening")) (setq off2 (getreal "enter Tee road lane width")) (setq rad (getreal "enter turning radius")) (setq td (getreal "enter Td value")) (setq ld (getreal "enter Ld value")) (setq lanewid (getreal "Enter the main road width")) (setq wide (getreal "Enter the widening width")) (Setq pt4 (polar pt1 ang1 dist1)) (setq pt4 (polar pt4 (- ang1 (/ pi 2.0)) (+ lanewid wide)) (setq pt4 (polar pt4 (- ang1 (/ pi 2.0)) (+ off1)) (setq pt5 (polar pt5 (- ang2 (/ pi 180.0)) (+ off2)) (command "Line" pt4 pt5 "") ) (princ) ) Can you please advise me how to fix this error "; error: bad argument type: numberp: nil" Quote
BIGAL Posted December 3, 2019 Posted December 3, 2019 (edited) Look at my image and PT4 it is calculated from the distance (+ ld off2 radius) Your almost there for one side. (setq wide (getreal "Enter the widening width")) (setq dist1 (+ .............)) (Setq pt4 (polar pt1 ang1 dist1)) (setq pt4 (polar pt4 (- ang1 (/ pi 2.0)) (+ lanewid wide))) (setq dist1 (- dist1 td)) (setq pt5 (polar pt1 ang1 dist1)) (setq pt5 (polar pt5 (- ang1 (/ pi 2.0)) (+ lanewid wide))) (command "Line" pt4 pt5 "") (setq dist1 (+ off2 rad)) (setq pt6 (polar pt1 ang1 dist1)) (setq pt6 (polar pt6 (- ang1 (/ pi 2.0)) off1)) (command "Line" pt6 pt5 "") (setq l1 (entlast)) ; to be used later with fillet adn radius (setq pt7 (polar pt1 ang2 .....)) (setq pt7 (polar pt7 ..............)) Edited December 3, 2019 by BIGAL Quote
Emmanuel Delay Posted December 4, 2019 Posted December 4, 2019 [silly joke] I thought you wanted the AC/DC logo. In case you do ... (vl-load-com) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Draw a polyline ;; https://www.cadtutor.net/forum/topic/18257-entmake-functions/ (defun LWPoly (lst cls) (entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length lst)) (cons 70 cls)) (mapcar (function (lambda (p) (cons 10 p))) lst))) ) (defun c:acdc ( / data a) (setq data (list '((1.6905 1.55027) (2.20405 1.06033) (2.71946 1.57109) (2.48811 1.76213) (2.48811 3.65217) (1.71779 4.35778) (0.892307 3.60286) (0.892307 1.76634) (0.65594 1.55624) (1.18045 1.06951)) '((1.4799 2.73277) (1.89083 2.73277) (1.89083 3.32695) (1.4799 3.69405)) '((1.4827 2.13485) (1.4827 1.77067) (1.68758 1.57361) (1.88384 1.77067) (1.88384 2.13485)) '((3.44967 4.37445) (2.67667 3.65673) (2.67667 1.74523) (3.41504 1.06647) (4.23912 1.84753) (3.80836 2.23932) (3.36478 1.84771) (3.26951 1.9403) (3.26951 3.662) (3.81711 3.17849) (4.26314 3.60959)) '((5.55062 3.69932) (4.89598 3.69932) (4.22559 2.2953) (4.72281 2.2953) (4.18629 0.848992) (5.73522 2.85274) (5.21933 2.85274)) '((6.90364 4.3586) (6.15746 4.3586) (5.71691 3.92475) (5.94174 3.69645) (5.94174 1.73324) (5.70478 1.51149) (6.15198 1.0777) (6.91297 1.0777) (7.54768 1.67106) (7.54768 3.75138)) '((6.53504 3.78957) (6.53504 1.61555) (6.95157 1.99675) (6.95157 3.40942)) '((8.49933 4.37445) (7.72632 3.65673) (7.72632 1.74523) (8.42643 1.0302) (9.28877 1.84753) (8.85802 2.23932) (8.41443 1.84771) (8.31916 1.9403) (8.31916 3.662) (8.86676 3.17849) (9.31279 3.60959)) ) ) (foreach a data (LWPoly a 1) ) ) [/silly joke] Quote
Sheep Posted December 5, 2019 Author Posted December 5, 2019 15 hours ago, Emmanuel Delay said: [silly joke] I thought you wanted the AC/DC logo. In case you do ... [/silly joke] Nice one but now you made me even confused haha. But yeah, a new learning stuff for me, thanks. 1 Quote
Sheep Posted December 5, 2019 Author Posted December 5, 2019 On 12/3/2019 at 8:54 AM, BIGAL said: Look at my image and PT4 it is calculated from the distance (+ ld off2 radius) Your almost there for one side. Thanks for the reply. A bit busy with making 40+ acdc lane manually. Will take a look at your comment later. Thanks. Quote
Sheep Posted December 6, 2019 Author Posted December 6, 2019 I now can understand about polar getpoint angel and getreal little bit. But, how to i make the radius at the last lane? the length of the "Lm" & "Ld" starts at the end of radius. Quote
BIGAL Posted December 6, 2019 Posted December 6, 2019 You could make the radius but its much easier to use the fillet command and let autocad do the work. When you draw the line pt5-pt6 you do this (setq ent1 (entlast)) this remembers the new line entity. Then draw line pt7-pt8 and again (setq ent2 (entlast)) Easy now (command "fillet" "R" rad ent1 ent2) and radius is drawn. Quote
Sheep Posted December 20, 2019 Author Posted December 20, 2019 (edited) How can i pick the points and use it to make lines? (defun c:loop2 () (setq ptlist nil) (while (setq pt (getpoint "\nEnter Point or RETURN when done: ")) (setq ptlist (append ptlist (list pt))) ) (princ) ) Tried using the code from AfraLISP to extract 'car' and 'cadr' from 'ptlist. Thank you. Link : AfraLISP Edited December 20, 2019 by Sheep Quote
BIGAL Posted December 20, 2019 Posted December 20, 2019 (edited) Its called Pline As per our private mail the road cl will need to be a pline, so curves are supported. There are 3 separate options for a tee so I am looking at these 3, hopefully will work with any number of road intersections as a cross road will not have a "passing". Still working on it other stuff got in the way. Edited December 20, 2019 by BIGAL 1 Quote
Sheep Posted December 23, 2019 Author Posted December 23, 2019 (edited) Hi BIGAL. Tested your LISP routine and i need some clear instruction. Loaded all files ( 3 of them) and entered "SLIP-LANE". Can you please explain these items please: 1. Pick Main road cl near new Tp (what is TP?) 2. Pick C/l's intersection point (what is C/l?) 3. Pick side away from main road edge 4. Pick side rd cl just below offsets What should i pick and where? What do you mean by "Main road width" from the dialogbox? Is it the total width of the new main road excluding the new lane? Or is it the new main road plus the new lane width? I also can't give the nos of lane to be make (let say the main road is 1 lane per side and i want to add another 2 new lane next to the existing main road) and got an error ( refer image). Maybe our "civil engineering" language a little bit different. Below is the actual Malaysian Code for road design. As per law of our company, i can't upload acad dwg without their approval. That's why i can only upload a small portion of the dwg. AC_DC_LANE.pdf Edited December 23, 2019 by Sheep 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.