偏移变色lisp_直线偏移联动 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...

本文介绍了一个AutoLISP程序,用于实现直线偏移功能并联动更新与其相接触的直线。用户先选择参照直线,然后指定偏移目标点,程序会自动计算偏移距离。如果两端均有相同图层的线相连,参照直线将执行偏移;若仅一端有线相连,则同时改变直线。程序特别适用于处理垂直线条的情况,但未包含斜角相交的延伸功能。
摘要由CSDN通过智能技术生成

本帖最后由 masterlong 于 2018-11-4 15:08 编辑

;|

类似于edata发布的程序“直线偏移连动~偏移后修改与其相接触的直线”

和他不同的是

edata的程序需要先指定偏移距离,再选择直线,最后指定偏移方向

而我的程序是

先选择参照直线,再选择偏移目标点,直接计算出偏移距离

如果两头都有【同层】线相连,那么参照直线执行偏移

如果仅一头有线相连,那么偏移同时,改变直线到偏移目标点

由于我的应用环境,需要进行如上操作的都是互相垂直的线,所以没加入斜角相交延伸的功能

|;

(vl-load-com)

;;命令是OLL        ————话说,论坛能设置成屏蔽“字母组合自动转表情”吗????

(defun c

ll()

(if (setq ss (ssget":E:S" '((0 . "line"))))

(progn

(command "undo" "g")

(ssdraw ss 3)

(setq pickpt (last (last (car (ssnamex ss)))))  ;;选取点

(setq line (ssname ss 0))

(setq lay (dxf 8 line))

(setq p10 (dxf 10 line))

(setq p11 (dxf 11 line))

(if (< (distance p10 pickpt) (distance p11 pickpt))

(setq pa p10  pb p11)

(setq pa p11  pb p10)

)

(zooment line 2)

(setq ss1 (ssget "F" (list p10 p11) (list '(0 . "line") (cons 8 lay))))

(setq ss1 (ss2list ss1))

(setq ss1 (vl-remove line ss1))

(command "_.zoom" "p")

(ssdraw ss1 3)

(if (setq pc (getpoint pa "\n指定偏移点: "))

(progn

(setq yn (vl-remove-if-not ''((one) (or (equal (distance (dxf 10 one) pa) 0 5) (equal (distance (dxf 11 one) pa) 0 5))) ss1))

(do_offset)

)

)

(ssdraw ss  4)

(ssdraw ss1 4)

(command "undo" "e")

(c

ll)

)

)

(princ)

)

(defun do_offset()

(setq ang (angle pa pc))

(setq dist (distance pa pc))

(setq pd (polar pb ang dist))

(setq pd (per_po pb pc pd))

(if yn

(setq pc (per_po pa pc pd))

)

(entmodone line 10 pc)

(entmodone line 11 pd)

;|

(setq pa (list (car pa) (cadr pa)))

(setq pb (list (car pb) (cadr pb)))

(setq pc (list (car pc) (cadr pc)))

(setq pd (list (car pd) (cadr pd)))

|;

(foreach linef ss1

(setq pm (dxf 10 linef)

pn (dxf 11 linef)

)

;;(setq pm (list (car pm) (cadr pm)))

;;(setq pn (list (car pn) (cadr pn)))

(setq px (inters pa pb pm pn NIL))

(cond

((equal (distance pm px) 0 5)  (setq dxfnm 10))

((equal (distance pn px) 0 5)  (setq dxfnm 11))

( T (setq dxfnm NIL))

)

(setq px (inters pc pd pm pn NIL))

(if (and px dxfnm)

(entmodone linef dxfnm px)

)

)

)

;;公共函数

;999获取图元某个dxf组码

(defun dxf( ent n / temp )

(if (and (= (type ent) 'int) (= (type n) 'ename))

(setq temp  ent

ent n

n  temp

)

)

(cdr (assoc n (entget ent)))

)

;999按指定的模式重画一个选择集的全部物体4=1->2->4)>    【支持模型多视口,支持布局中视口】

;;  1:显示  2:消隐  3:高亮  4:低亮

(defun ssdraw( ss mode / i ent )

(if (= (strcase (getvar "ctab")) "MODEL")

(if (member mode '(1 2 3 4))

(foreach vp (reverse (vports))

(setvar "cvport" (car vp))

(cond

((= (type ss) 'PICKSET)

(foreach ent (ss2list ss)

(redraw ent mode)

)

)

((= (type ss) 'list)

(foreach ent ss

(redraw ent mode)

)

)

((= (type ss) 'ename)

(redraw ss mode)

)

)

)

)

(cond

((= (type ss) 'PICKSET)

(foreach ent (ss2list ss)

(redraw ent mode)

)

)

((= (type ss) 'list)

(foreach ent ss

(redraw ent mode)

)

)

((= (type ss) 'ename)

(redraw ss mode)

)

)

)

(princ)

)

;999以指定图元缩放窗口

(defun zooment( ent sc / box x midpo )

(setq *acad*      (vlax-get-acad-object))

(setq box (entbox ent))

(setq midpo (getmidpo box))

(setq box (mapcar '(lambda (x) (p0_sc_p1 midpo x sc)) box))

(vla-zoomwindow *acad* (vlax-3d-point (car box)) (vlax-3d-point (cadr box)))

box

)

;999以基点p0缩放p1————P0为缩放基点

(defun p0_sc_p1 (p0 p1 sc )

(polar p0 (angle p0 p1) (* sc (distance p0 p1)))

)

;999修改一个图元的某个数据   ——————不是所有的图元都适用此方式

(defun entmodone( ent dxfnum data )

(entmod (list (cons -1 ent)(cons dxfnum data)))

)

;999一点到另两点形成直线的垂足

(defun per_po( p1 p2 p3 / ang ptemp )

(setq ang (angle p2 p3))

(setq ang (+ ang (/ PI 2)))

(setq ptemp (polar p1 ang 1000))

(inters p1 ptemp p2 p3 nil)

)

漏了一些子函数见7楼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值