boesiii
2006-03-21, 07:10 PM
I am writing a routine that lists plan distances and angles of a horizontal alignment and then uses the lists to make a construction line with station and angle on a profile grid. The routine only works with straight line segments. How can I test to see if an intersection point is the start of a curve or line segment.
What I would like to happen is, have the routine test the vertex, if the vertex is a start of a line segment then curve_question=0 and if the vertex is the start of a curve then curve_question=1. Then add the result to a list and continue till the end of the line.
Here is the code:
(defun rtd (a)
(* (/ a pi) 180.0)
)
(defun dtr (a)
(* (/ a 180.0) pi)
)
;;;--------------------Make Objects----------------------------------------
(defun make_objects ()
(setq line_len 20)
(setq n 0)
(setq pro_angle (rtd (angle pro_pt1 pro_pt2)))
(setq list_len (length dist_list))
(while (> list_len 0)
(progn
(setq off_pt1 (polar pro_pt1 (dtr pro_angle) (nth n dist_list)))
(setq off_pt2 (polar off_pt1 (dtr (+ pro_angle 90)) line_len))
(setq off_pt3 (polar pro_pt1 (dtr pro_angle) (+ (nth n dist_list) (getvar "textsize"))))
(entmake
(list
(cons 0 "line")
(cons 100 "AcDbEntity")
(cons 10 off_pt1)
(cons 11 off_pt2)
))
;(command "pline" off_pt1 off_pt2 "")
(setq dist_text (strcat "Sta = " (rtos (nth n dist_list) 2 2)))
(entmake (list
(cons 0 "TEXT")
(cons 100 "AcDbEntity")
(cons 67 0)
(cons 410 "Model")
(cons 8 "0")
(cons 100 "AcDbText")
(cons 10 off_pt1)
(cons 40 1.0)
(cons 1 dist_text)
(cons 50 (dtr (+ pro_angle 90)))
(cons 41 1.0)
(cons 51 0.0)
(cons 7 "L100RS 10")
(cons 71 0)
(cons 72 0)
(cons 100 "AcDbText")
(cons 73 0)
))
(setq ang_text (strcat "Angle = "(rtos (nth n fin_angle_list) 2 2)))
(entmake (list
(cons 0 "TEXT")
(cons 100 "AcDbEntity")
(cons 67 0)
(cons 410 "Model")
(cons 8 "0")
(cons 100 "AcDbText")
(cons 10 off_pt1)
(cons 40 1.0)
(cons 1 ang_text)
(cons 50 (dtr (+ pro_angle 90)))
(cons 41 1.0)
(cons 51 0.0)
(cons 7 "L100RS 10")
(cons 71 0)
(cons 72 0)
(cons 11 off_pt3)
(cons 100 "AcDbText")
(cons 73 3)
))
(setq list_len (- list_len 1))
(setq n (1+ n))
))
)
;;;----------------End of Make Objects----------------------------------------
;;;----------------Begin Calc Point List--------------------------------------
(defun calc_pt_list ()
(setq len (length object))
(setq n 0)
(setq pt_list (list))
(setq dist_list (list))
(setq angle_list (list))
(repeat len
(setq object1 (car (nth n object)))
(if (= object1 10)
(progn
(setq pt_list (cons (cdr (nth n object)) pt_list))
);progn
);if
(setq n (1+ n))
);repeat
(setq pt_list_len (length pt_list))
(setq pt_list (reverse pt_list))
)
;;;-------------------End of Calc Point List----------------------------------
;;;-------------------Begin of Dist List--------------------------------------
(defun calc_dist_list ()
(setq total_dist 0)
(setq pt_dist 0)
(setq dist_list (cons pt_dist dist_list))
(setq n 0)
(setq counter 1)
(while (> pt_list_len 1)
(progn
(setq pt1 (nth n pt_list))
(setq pt2 (nth (+ n 1) pt_list))
(setq pt_dist (+ pt_dist (distance pt1 pt2)))
(setq dist_list (cons pt_dist dist_list))
(setq total_dist (+ total_dist pt_dist))
(setq pt_list_len (- pt_list_len 1))
(setq angle1 (rtd (angle (nth n pt_list) (nth (+ n 1) pt_list))))
(setq angle_list (cons angle1 angle_list))
(setq n (1+ n))
));progn while
(setq dist_list (reverse dist_list))
(setq angle_list (reverse angle_list))
)
;;;----------------------End of Calc Dist List--------------------------------------
;;;----------------------Begin Calc Fin Angle List----------------------------------
(defun calc_fin_angle_list ()
(setq angle_list_len (length angle_list))
(setq fin_angle 0)
(setq fin_angle_list (cons fin_angle fin_angle_list))
(setq n 0)
(while (> angle_list_len 1)
(progn
(setq angle1 (nth n angle_list))
(setq angle2 (nth (1+ n) angle_list))
(if (and (< angle1 180) (> (+ angle1 180) angle2))
(setq fin_angle (- (+ angle1 180) angle2)))
(if (and (< angle1 180) (< (+ angle1 180) angle2))
(setq fin_angle (- 360 (- angle2 (+ angle1 180)))))
(if (and (> angle1 180) (< (- angle1 180) angle2))
(setq fin_angle (- (- angle2 (- angle1 180)) 360)))
(if (and (> angle1 180) (> (- angle1 180) angle2))
(setq fin_angle (- (- angle1 180) angle2)))
(setq fin_angle_list (cons fin_angle fin_angle_list))
(setq angle_list_len (- angle_list_len 1))
(setq n (1+ n))
))
(setq fin_angle_list (cons 0 fin_angle_list))
(setq fin_angle_list (reverse fin_angle_list))
)
;;;----------End of Calc Fin Angle List----------------------------------------
(defun c:p2p (/ object len n object1 pt_list pt_dist total_dist
pt1 pt2 pt_list_len dist_list angle_list counter pt3
angle1 angle2 fin_angle fin_angle_list pro_pt1 pro_pt2 off_pt1
off_pt2 pro_angle)
(initerr)
(setq object (entget (car (entsel))))
(setq pro_pt1 (getpoint "\nPick 0+00 on Profile: "))
(setq pro_pt2 (getpoint "\nPick another point on Profile baseline: "))
(calc_pt_list)
(calc_dist_list)
(fin_angle_list)
(make_objects)
(reset)
(princ)
);defun
(princ)
What I would like to happen is, have the routine test the vertex, if the vertex is a start of a line segment then curve_question=0 and if the vertex is the start of a curve then curve_question=1. Then add the result to a list and continue till the end of the line.
Here is the code:
(defun rtd (a)
(* (/ a pi) 180.0)
)
(defun dtr (a)
(* (/ a 180.0) pi)
)
;;;--------------------Make Objects----------------------------------------
(defun make_objects ()
(setq line_len 20)
(setq n 0)
(setq pro_angle (rtd (angle pro_pt1 pro_pt2)))
(setq list_len (length dist_list))
(while (> list_len 0)
(progn
(setq off_pt1 (polar pro_pt1 (dtr pro_angle) (nth n dist_list)))
(setq off_pt2 (polar off_pt1 (dtr (+ pro_angle 90)) line_len))
(setq off_pt3 (polar pro_pt1 (dtr pro_angle) (+ (nth n dist_list) (getvar "textsize"))))
(entmake
(list
(cons 0 "line")
(cons 100 "AcDbEntity")
(cons 10 off_pt1)
(cons 11 off_pt2)
))
;(command "pline" off_pt1 off_pt2 "")
(setq dist_text (strcat "Sta = " (rtos (nth n dist_list) 2 2)))
(entmake (list
(cons 0 "TEXT")
(cons 100 "AcDbEntity")
(cons 67 0)
(cons 410 "Model")
(cons 8 "0")
(cons 100 "AcDbText")
(cons 10 off_pt1)
(cons 40 1.0)
(cons 1 dist_text)
(cons 50 (dtr (+ pro_angle 90)))
(cons 41 1.0)
(cons 51 0.0)
(cons 7 "L100RS 10")
(cons 71 0)
(cons 72 0)
(cons 100 "AcDbText")
(cons 73 0)
))
(setq ang_text (strcat "Angle = "(rtos (nth n fin_angle_list) 2 2)))
(entmake (list
(cons 0 "TEXT")
(cons 100 "AcDbEntity")
(cons 67 0)
(cons 410 "Model")
(cons 8 "0")
(cons 100 "AcDbText")
(cons 10 off_pt1)
(cons 40 1.0)
(cons 1 ang_text)
(cons 50 (dtr (+ pro_angle 90)))
(cons 41 1.0)
(cons 51 0.0)
(cons 7 "L100RS 10")
(cons 71 0)
(cons 72 0)
(cons 11 off_pt3)
(cons 100 "AcDbText")
(cons 73 3)
))
(setq list_len (- list_len 1))
(setq n (1+ n))
))
)
;;;----------------End of Make Objects----------------------------------------
;;;----------------Begin Calc Point List--------------------------------------
(defun calc_pt_list ()
(setq len (length object))
(setq n 0)
(setq pt_list (list))
(setq dist_list (list))
(setq angle_list (list))
(repeat len
(setq object1 (car (nth n object)))
(if (= object1 10)
(progn
(setq pt_list (cons (cdr (nth n object)) pt_list))
);progn
);if
(setq n (1+ n))
);repeat
(setq pt_list_len (length pt_list))
(setq pt_list (reverse pt_list))
)
;;;-------------------End of Calc Point List----------------------------------
;;;-------------------Begin of Dist List--------------------------------------
(defun calc_dist_list ()
(setq total_dist 0)
(setq pt_dist 0)
(setq dist_list (cons pt_dist dist_list))
(setq n 0)
(setq counter 1)
(while (> pt_list_len 1)
(progn
(setq pt1 (nth n pt_list))
(setq pt2 (nth (+ n 1) pt_list))
(setq pt_dist (+ pt_dist (distance pt1 pt2)))
(setq dist_list (cons pt_dist dist_list))
(setq total_dist (+ total_dist pt_dist))
(setq pt_list_len (- pt_list_len 1))
(setq angle1 (rtd (angle (nth n pt_list) (nth (+ n 1) pt_list))))
(setq angle_list (cons angle1 angle_list))
(setq n (1+ n))
));progn while
(setq dist_list (reverse dist_list))
(setq angle_list (reverse angle_list))
)
;;;----------------------End of Calc Dist List--------------------------------------
;;;----------------------Begin Calc Fin Angle List----------------------------------
(defun calc_fin_angle_list ()
(setq angle_list_len (length angle_list))
(setq fin_angle 0)
(setq fin_angle_list (cons fin_angle fin_angle_list))
(setq n 0)
(while (> angle_list_len 1)
(progn
(setq angle1 (nth n angle_list))
(setq angle2 (nth (1+ n) angle_list))
(if (and (< angle1 180) (> (+ angle1 180) angle2))
(setq fin_angle (- (+ angle1 180) angle2)))
(if (and (< angle1 180) (< (+ angle1 180) angle2))
(setq fin_angle (- 360 (- angle2 (+ angle1 180)))))
(if (and (> angle1 180) (< (- angle1 180) angle2))
(setq fin_angle (- (- angle2 (- angle1 180)) 360)))
(if (and (> angle1 180) (> (- angle1 180) angle2))
(setq fin_angle (- (- angle1 180) angle2)))
(setq fin_angle_list (cons fin_angle fin_angle_list))
(setq angle_list_len (- angle_list_len 1))
(setq n (1+ n))
))
(setq fin_angle_list (cons 0 fin_angle_list))
(setq fin_angle_list (reverse fin_angle_list))
)
;;;----------End of Calc Fin Angle List----------------------------------------
(defun c:p2p (/ object len n object1 pt_list pt_dist total_dist
pt1 pt2 pt_list_len dist_list angle_list counter pt3
angle1 angle2 fin_angle fin_angle_list pro_pt1 pro_pt2 off_pt1
off_pt2 pro_angle)
(initerr)
(setq object (entget (car (entsel))))
(setq pro_pt1 (getpoint "\nPick 0+00 on Profile: "))
(setq pro_pt2 (getpoint "\nPick another point on Profile baseline: "))
(calc_pt_list)
(calc_dist_list)
(fin_angle_list)
(make_objects)
(reset)
(princ)
);defun
(princ)