如何生成图中除弧线以外的元素?
程序:
选取p1和p2点后,其他数据都自动生成,新手,不知道mt2和m2的点坐标怎样得
到。求大神给予解答。
;思路
;红色的弧线是本来就有的
;选取p1点和p2点,链接成直线L1
;取直线L1的中点m1做垂线,与弧线的交点m2, m1 m2连线为L2
;选取距p1点200的地方做mt1,做垂线,与弧线交点mt2, mt1 mt2连线为L3
;量取L2和L3长度并显示
另:对于垂线的方向
;我的想法
;比较p1和p2的y值(取大的为MAX小的为MIN)
;若弧线的y值的集合全部大于最小值则垂线向上
;若弧线的y值的集合全部小于最大值则垂线向下
还有什么其他的方法判断垂线的方向吗?
已经知道圆弧,那么圆心半径知道,圆心到中点m1的方向就是垂线方向, ;先简单写一个。;已知弧画线
(defun c:tt ()
(setvar "CMDECHO" 0)
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 1)
(if (and (setq p1 (getpoint "\n选择圆弧一个端点: "))
(setq p2 (getpoint p1 "\n选择圆弧另一个端点: "))
(setq ss (ssget "C" p1 p1 '((0 . "ARC"))))) (progn
(setq ent (entget(ssname ss 0))
pc (cdr(assoc 10 ent))
r (cdr(assoc 40 ent))
pm (mapcar '(lambda (a b) (/ (+ a b) 2)) p1 p2)
p3 (polar p1 (angle p1 p2) 200)
p4 (polar p1 (angle pc pm) 200)
p5 (polar pc (angle pc pm) r))
(command "_.LINE" p1 p2 "")
(command "_.RAY" pm p5 "")
(command "_.RAY" p3 p4 "")
))
(setvar "OSMODE" oldos)
(princ)
)
(defun c:tt(/ @200 @200_arc_pt @a a ang2 b c cen en end_ang end_pt mid_arc_pt mid_pt rad start_ang start_pt)
(if(and(setq en(car(entsel"\n选择圆弧==>:" )))
(=(sk_dxf en 0) "ARC"))
(progn
(setq cen(sk_dxf en 10)
start_ang(sk_dxf en 50)
end_ang(sk_dxf en 51)
rad(sk_dxf en 40)
)
(setq start_pt(polar cen start_ang rad)
end_pt(polar cen end_ang rad))
(setq ang2(+ (angle end_pt start_pt ) (* pi 0.5)))
(setq mid_pt(mapcar '* '( 0.5 0.5 0.5) (mapcar '+ start_pt end_pt)))
(setq mid_arc_pt(polar cen ang2 rad))
(setq @200(polar end_pt (angle end_pt start_pt) 200.0))
(setq @a(polar @200 (angle mid_pt cen) (distance mid_pt cen)))
(setq a (distance @a cen)
c rad
b (sqrt (abs (- (* c c) (* a a ))))
)
(setq @200_arc_pt (polar @aang2 b))
(entmake (list '(0 . "line")(cons 10 start_pt)(cons 11 end_pt)))
(entmake (list '(0 . "line")(cons 10 mid_pt)(cons 11 mid_arc_pt)))
(entmake (list '(0 . "line")(cons 10 @200)(cons 11 @200_arc_pt)))
)
(princ"\n未选择圆弧对象")
)
(princ)
)
(defun sk_dxf(ent code)(cdr(assoc code(entget ent))))
ZZXXQQ 发表于 2015-8-26 08:22 static/image/common/back.gif
;先简单写一个。
谢谢你的回答,不过实际测试时没有成功。
选择完第二个点,之后的命令效果变为以第二个点为起点,选中的点为方向做出的射线。 edata 发表于 2015-8-26 16:13 static/image/common/back.gif
谢谢你的回答。
虽然不是我想要的选取两个点的方式,但形成的最终效果除了标注外和我想要的一样。
还有 sk_dxf 代表的是什么意思 sk_dxf是自定义函数,提取图元的组码值。
你可以直接地理解为 (cdr(assoc code(entget ent)))
因为你提供的已知条件已经满足绘图需求,所以直接选取圆弧来获得弦长的起点和终点比点击两点方便。
当然也可以更改为你的两点方式+选取圆弧,更改
(setq start_pt(polar cen start_ang rad)
end_pt(polar cen end_ang rad))
(setq start_ang(sk_dxf en 50)
end_ang(sk_dxf en 51)
)
这几个变量为(getpoint)和(angle censtart_pt) (angle cenend_pt)
具体的你可以自己推敲推敲。
至于标注,这个由你自己完成了。标注涉及到标注样式和标注文字点,这个需要你自己去完善。
本帖最后由 waterchen 于 2015-9-5 14:14 编辑
楼主看看,是不是想要这样效果的。
(defun c:tt (/
ang
c
data dimsty dimoff dimtxh dimp1 dimp2 dimp3
ent *error*
olderr
m1 m2 mt1 mt2
p1 p2
r
)
(defun *error* (msg)
(princ (strcat "\nError: " msg))
(if (= 8 (logand 8 (getvar 'UNDOCTL)))
(vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(setq *error* olderr)
(princ)
)
(defun make_Dim (p1 p2 p3 ang /)
(entmakex
(list
'(0 . "DIMENSION")
'(100 . "AcDbEntity")
'(100 . "AcDbDimension")
(cons 10 p3)
'(11 0. 0. 0.)
'(70 . 32)
'(100 . "AcDbAlignedDimension")
(cons 13 p1)
(cons 14 p2)
(cons 50 ang)
'(100 . "AcDbRotatedDimension")
)
)
)
(defun make_line (p1 p2)
(entmakex (list '(0 . "LINE")
'(100 . "AcDbEntity")
'(100 . "AcDbLine")
(cons 10 p1)
(cons 11 p2)
'(210 0. 0. 1.)
)
)
)
;;;**************************main program**************************;;;
(setq olderr *error*)
(setqp1 (getpoint "\nFirst point:"))
(initget (+ 32 128))
(setqp2 (getpoint p1 "\nSecond point:"))
(if (and (= 'LIST (type p1)) (= 'LIST (type p2)) (setq ent (car (nentselp p1))))
(progn
(vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq
ang(angle p1 p2)
m1 (polar p1 ang (* 0.5 (distance p1 p2)))
m2 (vlax-curve-getClosestPointto ent m1 nil)
data (entget ent)
c (cdr (assoc 10 data))
r (cdr (assoc 40 data))
mt1(polar p1 ang 200.0)
mt2(polar
mt1
(if (> (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1))) 0.0)
(+ ang (* 0.5 pi))
(- ang (* 0.5 pi))
)
(- (sqrt (- (expt r 2.0) (expt (distance m1 mt1) 2.0))) (distance m1 c))
)
dimsty (tblsearch "Dimstyle" (getvar "dimstyle"))
dimoff (* (cdr (assoc 40 dimsty)) (cdr (assoc 147 dimsty)))
dimtxh (* (cdr (assoc 40 dimsty)) (cdr (assoc 140 dimsty)))
dimtxh (+ dimoff (* 3.0 dimtxh))
dimp1(polar m1 ang dimtxh)
dimp2(polar mt1 ang dimtxh)
dimp3(polar mt2
(if (> (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1))) 0.0)
(+ ang (* 0.5 pi))
(- ang (* 0.5 pi))
)
dimtxh
)
)
(make_line p1p2)
(make_line m1m2)
(make_line mt1 mt2)
(make_Dim m1m2dimp1 (angle m1m2))
(make_Dim mt1 mt2 dimp2 (angle mt1 mt2))
(make_Dim p1mt2 dimp3 (angle p1mt1))
(vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
)
)
(setq *error* olderr)
(princ)
)
waterchen 发表于 2015-9-5 12:54 static/image/common/back.gif
楼主看看,是不是想要这样效果的。
很不错,如果圆心角大于180的时候,不正确,nentselp不如ssget,否则。。。 edata 发表于 2015-9-5 14:10 static/image/common/back.gif
很不错,如果圆心角大于180的时候,不正确,nentselp不如ssget,否则。。。
E大,你真细心,没测试过大角度的。
页:
[1]
2