已解决(求助)以下百叶窗源码是春婵大神写的,现在请教一下各位大神,能否帮忙改成90度
本帖最后由 999999 于 2020-12-18 18:18 编辑麻烦各位大神出手,看一下是否能够把以下百叶的源码改成90度的,小弟在此谢谢各位大神啦
;百叶窗
(vl-load-com)
(defun c:by(/ osmode_bak clayer_bak pt1 pt3 pt2 kd jd dd nmb dst ang p1 p2 recss bylayer)
(defun *MYERR* (MSG)
(setvar "CMDECHO" CMD_OLD)
(setvar "OSMODE" OS_OLD)
(setq *ERROR* *OLDERR*)
(if (= MSG "春婵程序完美退出,谢谢使用。")
(princ (strcat "\\n>>>" MSG))
(princ "\\n>>>虽然中途退出了,对象捕捉已经被恢复。")
)
(princ)
)
(setq *OLDERR* *ERROR*
*ERROR**MYERR*
OS_OLD (getvar "OSMODE")
CMD_OLD(getvar "CMDECHO")
)
;----开始系统变量备份----
(setvar "cmdecho" 0);_关闭命令提示
(command "._undo" "_begin")
(setq osmode_bak (getvar "osmode"));_记录捕捉
(setvar "osmode" 0);_关闭捕捉
(setq clayer_bak (getvar "clayer"));_记录当前图层
;----绘制部分开始----
(setvar "osmode" 2065)
(setq pt1 (getpoint "\n框选范围:")
pt3 (getcorner pt1)
pt2 (list (car pt1) (cadr pt3))
)
(if *kd* (setq Newkd (getreal (strcat"\n百叶框和条宽度:<" (rtos *kd* 2 2) ">:") ) )
(setq Newkd (getreal"\n百叶框和条宽度:")))
(if (null Newkd) (setq Newkd *kd*) (setq *kd* Newkd));记忆宽
(if *jd* (setq Newjd (getreal (strcat"\n百叶分隔近似值间距:<" (rtos *jd* 2 2) ">:") ) )
(setq Newjd (getreal"\n百叶分隔近似值间距:")))
(if (null Newjd) (setq Newjd *jd*) (setq *jd* Newjd));记忆间距
(setq dd(- (distance pt1 pt2) *kd*)
nmb (/ dd (+ *kd* *jd*))
nmb (atoi (rtos nmb 2 0))
dst (/ dd nmb)
ang (angle pt2 pt1)
nmb (1- nmb)
)
(setvar "osmode" 0)
(setq p1 (list (+ *kd* (car pt2)) (+ *kd* (cadr pt2))))
(setq p2 (list (- (car pt3) *kd*) (+ dst (cadr pt3))))
(command ".rectang" "_non" pt1 "_non" pt3)
(xlr_submod (entlast) 8 "layer2")
(command ".rectang" "_non" p1 "_non" p2)
(xlr_submod (entlast) 8 "layer7")
(setq recSS (entlast))
(command ".chprop" recSS "" "c" Bylayer "")
(command "_.COPY" recSS "" "M" p1)
(repeat nmb
(command (setq p1 (polar p1 ang dst)))
)
(command "")
;----绘制部分结束----
;----结束系统变量还原----
(setvar "osmode" osmode_bak);_还原捕捉
(setvar "clayer" clayer_bak);_还原图层
(command "._undo" "_end")
(setvar "cmdecho" 1);_打开命令提示
(princ);_关闭程序返回值
);_程序结束
(defun xlr_submod (ename code newvalue / a el)
(if (setq a (assoc code (setq el (entget ename))))
(entmod (subst (cons code newvalue)
a
el
)
)
(entmod (append el (list (cons code newvalue))))
)
(entupd ename)
ename
)
(princ "\n**********春婵程序加载完成,启动命令:by **********")
(princ "\n")
本帖最后由 muwind 于 2020-12-17 22:55 编辑
999999 发表于 2020-12-17 08:50
您好,我这边用您的代码替换了,可是没有作用呢,我这边猜测是不是这一行代码的问题,可是我不知道怎么表 ...
我试过了 可以的,就是不知道是不是你要的效果(command "") 这个会造成 重复 by命令
啰嗦下算法:这个就是获取一个矩形框的pt1和pt3 (对角)
原程序根据pt1的X和pt3的Y求了个pt2 也就是矩形的做下角
我修改后求的是右上角的点,
用左下角的点其实也可以绘制,主要是为了将就原来的代码求得 PT1和PT2的距离用来计算百叶的数量
利用PT1和PT2的距离用来计算百叶的数量后就是绘制矩形框了,然后就是复制矩形
整个算法非常的简单,也很单纯,很容易出问题。
999999 发表于 2020-12-19 08:07
春婵大神,果然还是更新了呀,,您的工具箱啥时候,准备发布呀非常期待 ...
初略完善了下,这工作量绝对值一个币了修改特性的我删除了,有需要可以自行加上
http://bbs.mjtd.com/data/attachment/album/202012/19/000347w67wuef6n42c7nww.gif
attach://112303.gif
路过,顶下:lol 只能从左上右下的拾取,很不随性啊。只要修改如下部分就可以实现你的要求(不需要更改的未列出),不过建议楼主自我研究下
.......
(setq pt1 (getpoint "\n框选范围:")
pt3 (getcorner pt1)
pt2 (list (car pt3) (cadr pt1))
)
..........
(setvar "osmode" 0)
(setq p1 (list (-(car pt2) *kd*) (-(cadr pt2) *kd*)))
(setq p2 (list (-(car pt3) dst)(+ (cadr pt3) *kd*)))
.....
muwind 发表于 2020-12-16 23:39
只能从左上右下的拾取,很不随性啊。只要修改如下部分就可以实现你的要求(不需要更改的未列出),不过建议 ...
您好,我这边用您的代码替换了,可是没有作用呢,我这边猜测是不是这一行代码的问题,可是我不知道怎么表达90度,
ang (angle pt2 pt1)
xyp1964 发表于 2020-12-17 10:55
attach://112303.gif
您好,院长大人,下载了您的工具箱,没有看到那个百叶窗的插件呢
muwind 发表于 2020-12-17 22:45
我试过了 可以的,就是不知道是不是你要的效果(command "") 这个会造成 重复 by命令
啰嗦下算法:这个 ...
谢谢大神了,,真的有用 hhh454 发表于 2020-12-19 00:05
春婵大神,果然还是更新了呀,,:lol:lol您的工具箱啥时候,准备发布呀非常期待哟
页:
[1]
2