999999 发表于 2020-12-16 17:28:50

已解决(求助)以下百叶窗源码是春婵大神写的,现在请教一下各位大神,能否帮忙改成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:45:02

本帖最后由 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的距离用来计算百叶的数量后就是绘制矩形框了,然后就是复制矩形
整个算法非常的简单,也很单纯,很容易出问题。


muwind 发表于 2020-12-20 20:08:21

999999 发表于 2020-12-19 08:07
春婵大神,果然还是更新了呀,,您的工具箱啥时候,准备发布呀非常期待 ...
初略完善了下,这工作量绝对值一个币了修改特性的我删除了,有需要可以自行加上

hhh454 发表于 2020-12-19 00:05:08

http://bbs.mjtd.com/data/attachment/album/202012/19/000347w67wuef6n42c7nww.gif

xyp1964 发表于 2020-12-17 10:55:43


attach://112303.gif

GDFGFGF 发表于 2020-12-16 18:49:41

路过,顶下:lol

muwind 发表于 2020-12-16 23:39:30

只能从左上右下的拾取,很不随性啊。只要修改如下部分就可以实现你的要求(不需要更改的未列出),不过建议楼主自我研究下

.......
(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*)))
.....

999999 发表于 2020-12-17 08:50:40

muwind 发表于 2020-12-16 23:39
只能从左上右下的拾取,很不随性啊。只要修改如下部分就可以实现你的要求(不需要更改的未列出),不过建议 ...
您好,我这边用您的代码替换了,可是没有作用呢,我这边猜测是不是这一行代码的问题,可是我不知道怎么表达90度,
ang (angle pt2 pt1)

999999 发表于 2020-12-17 11:02:24

xyp1964 发表于 2020-12-17 10:55
attach://112303.gif

您好,院长大人,下载了您的工具箱,没有看到那个百叶窗的插件呢

999999 发表于 2020-12-18 08:21:43

muwind 发表于 2020-12-17 22:45
我试过了 可以的,就是不知道是不是你要的效果(command "") 这个会造成 重复 by命令

啰嗦下算法:这个 ...

谢谢大神了,,真的有用

999999 发表于 2020-12-19 08:07:26

hhh454 发表于 2020-12-19 00:05


春婵大神,果然还是更新了呀,,:lol:lol您的工具箱啥时候,准备发布呀非常期待哟
页: [1] 2
查看完整版本: 已解决(求助)以下百叶窗源码是春婵大神写的,现在请教一下各位大神,能否帮忙改成90度