明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3475|回复: 15

[已解答] 如何让插入的块按照线的方向改变

[复制链接]
发表于 2014-2-12 09:10 | 显示全部楼层 |阅读模式
现在的程序只能插入块,不能改变方向,我需要让块随线的方向同时改变
图一是现在的,图二是需要的
以下是源码:
(DEFUN C:zdhgd(/ ceco pw a1 b p1 p2 xp1 xp2)
        (SETVAR "cmdecho" 0)                                                                                                ;
        (if (= nil a)
                (alert "必须先指定手孔型号,通过“杆路管道”菜单“人手孔…”项设置。")
        );endif
        (setq a1 a)
        (while a1
        (if (or(= a "xzh")(= a "nxzh")(= a "ndanye")(= a "danye")(setvar "plinewid" 0.6)))    ;end if
        (SETQ ceco (GETVAR "cecolor"))                                                                                ;获取系统变量
        (SETQ pw (GETVAR "plinewid"))                                                                                ;获取原PLINE线宽
        (SETQ osmo (GETVAR "osmode"))                                                                                ;获取系统捕捉模式
        (if (= pw 0.6)(command "cecolor" "90"))
        (IF (= r1 nil)                                                                                                                ;r1为保存比例默认值的变量
                (SETQ r0 (GETREAL "\n输入比例,1:"))                                                                ;如果r1为空,输入图形比例
                (SETQ r0 (GETREAL (STRCAT "\n输入比例 1:<"(RTOS r1 2 0) ">")))        ;如果r1不为空,显示默认值
        ):endif
        (IF (= nil r0)                                                                                                                ;如果用户按回车
                (setq r0 r1)                                                                                                        ;将上次r1保存的r0值还原
                (setq r1 r0)                                                                                                        ;否则,用r1将r0的值保存起来
        );endif
        (SETQ r (/ r0 1000))                                                                                                ;计算实际绘图比例       
        (SETQ b 0)                                                                                                                        ;       
        (setvar "osmode"64)
    (setq p1 (getpoint "\n指定起始手孔:"))                                                                        ;
        (while p1
        (WHILE (/= b nil)                                                                                                        ;当输入弧度为空时,退出程序
                (SETVAR "osmode" 0)
                (SETQ b (GETANGLE "\n输入角度(按回车退出):" p1))
                (IF (/= b nil)                                                                                                        ;如果弧度不为空
                        (PROGN
                                (SETQ ang (ATOI (ANGTOS b)))                                                        ;将弧角度转换为角度
                                (SETQ d0 50)                                                                                               
                                (WHILE (/= d0 nil)                                                                                ;当输入距离为0时,退出循环,继续询问角度       
                                        (SETQ d0 (GETREAL "\n输入距离(按回车输入角度):"))                ;
                                        (IF (AND (/= d0 nil) (> d0 0))                                                ;当距离不为0时
                                                (PROGN                                                                                               
                                                        (SETQ d (/ d0 r))                                                        ;计算实际插入点R       
                                                        (SETQ p2 ( POLAR p1 b d))                                        ;计算第二手孔插入点
                                                        (COMMAND "insert" a p2 "" "" "")                        ;插入手孔
                                                        (SETQ xp1( POLAR p1 (ANGLE p1 p2) 2.6))                ;计算管道起点
                                                 (SETQ xp2( POLAR p2 (ANGLE p2 p1) 2.7))                ;计算管道终点
                                                        (COMMAND "pline" xp1 xp2 "")                                ;画管道
                                                                                                                                               ;========================
                                                       (SETQ dis (DISTANCE P1 P2))                                        ;计算管道中点
                                                       (SETQ pm (POLAR p1 b (/ dis 2)))                        ;pm为管道中点
                                                       (SETQ tang (REM ang 360))                                        ;计算标注文字方向(角度)
                                                       (IF (< tang 0 )                                                                ;如果角度是负值
                                                                (SETQ tang ( + 360 tang))                                ;转化为正值       
                                                       );endif       
                                                       (SETQ ta (ANGTOF (RTOS tang)))                                ;将方向角度转换为弧度       
                                                       (IF (AND (> tang 105) (< tang 285))                        ;如果标注方向在105 -- 285度之间
                                                               (PROGN                                                                        ;转换到-90 -- 90度之间       
                                                                       (SETQ tang (- tang 180))
                                                                       (SETQ ta (ANGTOF (RTOS tang)))
                                                               );end of progn
                                                       );endif
                                                       (SETQ pd (POLAR pm (+ 1.5707963 ta) 2.2))        ;计算文字插入点
                                                       (SETQ int_d (ATOI (RTOS d0 2 1)))
                                                       (IF (EQUAL (* d0 10) (* int_d 10))
                                                               (SETQ txt (RTOS d0 2 0))                                ;将距离转换为字符串
                                                               (SETQ txt (RTOS d0 2 1))
                                                       );endif
                                                (COMMAND "text" "J" "M" pd "2" tang txt)        ;以中点对齐方式标注距离
                                                                                                                                         ;=========================       
                                                 (SETQ p1 p2)                                                                ;将P2点坐标赋予P1,将第二手孔坐标作为下次循环的第一手孔坐标
                                         );end of progn
                                         (IF (AND (/= nil d0) (<= d0 0))
                                                 (PROMPT "\n错误!输入的距离小于0,重新输入。")
                                         );endif
                                 );endif
                         );end while
                 );end of progn
         );endif
     );end while
    (SETQ P1 NIL)
          );end while P1
        (SETQ R0 NIL)
        (SETVAR "cecolor" ceco )                                                                                ;恢复系统变量
    (SETVAR "plinewid" pw )                                                                                        ;恢复原PLINE线宽
    (SETVAR "osmode" osmo )                                                                                        ;恢复系统捕捉模式
    (PROMPT "\n结束管道绘制。")
(setq a1 nil)
);end while a
)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-11-14 01:02 | 显示全部楼层
连续画杆路和管道等CAD小插件、带统计工作量(Autolisp)这个程序是你编制的吧?
发表于 2021-11-14 11:03 | 显示全部楼层
有完整的代码吗  
 楼主| 发表于 2014-2-12 13:08 | 显示全部楼层
本帖最后由 lxdz443 于 2014-2-12 13:10 编辑

;;;hxn--需要指定绘制点(H),旋转方向(X),不进行块分解(N).
(defun c:hxn()
(setvar "cmdecho" 0)
   (command "insert" a "s" "1")
(princ "\n请指定绘制点:")
   (command pause)
(princ "\n请指定旋转方向(0):")
   (command pause)
   (princ)
   )
这个里面需要怎么设置才可以达到上图需要的效果?

另外请教一下,怎么查看命令参数?
发表于 2014-2-12 13:10 | 显示全部楼层
修改转角就可以了,组码好象是50
 楼主| 发表于 2014-2-12 13:31 | 显示全部楼层
角度不是死的,是根据画图需要,角度也不一样的。

点评

所以你要修改每个块的角度  发表于 2014-2-12 13:34
 楼主| 发表于 2014-2-12 13:52 | 显示全部楼层
需要的是这个效果
中间的方块是跟着线的方向改变的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2014-2-12 15:22 | 显示全部楼层
个人觉得也可以使用command "align"来实现,指定对齐的两个点,
 楼主| 发表于 2014-2-12 15:42 | 显示全部楼层
我只找到了手动调用align的命令。有没有直接加参数的方法。
发表于 2014-2-12 15:57 | 显示全部楼层
简单改了下。
  1. (DEFUN C:tt(/ ceco pw a1 b p1 p2 xp1 xp2)
  2.         (SETVAR "cmdecho" 0)
  3.         ;(setq a "xzh");
  4.         (if (= nil a)
  5.                 (alert "必须先指定手孔型号,通过“杆路管道”菜单“人手孔…”项设置。")
  6.         );endif
  7.         (setq a1 a)
  8.         (while a1
  9.         (if (or(= a "xzh")(= a "nxzh")(= a "ndanye")(= a "danye"))(setvar "plinewid" 0.6))    ;end if
  10.         (SETQ ceco (GETVAR "cecolor"))                                                                                ;获取系统变量
  11.         (SETQ pw (GETVAR "plinewid"))                                                                                ;获取原PLINE线宽
  12.         (SETQ osmo (GETVAR "osmode"))                                                                                ;获取系统捕捉模式
  13.         (if (= pw 0.6)(command "cecolor" "90"))
  14. ;;;        (IF (= r1 nil)                                                                                                                ;r1为保存比例默认值的变量
  15. ;;;                (SETQ r0 (GETREAL "\n输入比例,1:"))                                                                ;如果r1为空,输入图形比例
  16. ;;;                (SETQ r0 (GETREAL (STRCAT "\n输入比例 1:<"(RTOS r1 2 0) ">")))        ;如果r1不为空,显示默认值
  17. ;;;        );endif
  18. ;;;        (IF (= nil r0)                                                                                                                ;如果用户按回车
  19. ;;;                (setq r0 r1)                                                                                                        ;将上次r1保存的r0值还原
  20. ;;;                (setq r1 r0)                                                                                                        ;否则,用r1将r0的值保存起来
  21. ;;;        );endif
  22.     (or r1 (setq r1 1));r1如果r1 nil 设=1
  23.     (if (setq r0 (GETREAL (STRCAT "\n输入比例 :<"(RTOS r1 2 0) ">"))) (setq r1 r0));如果输入r0不为nil则使用r1=r0
  24.         (SETQ r (/ r1 1000))                                                                                                ;计算实际绘图比例        
  25.         (SETQ b 0)                                                                                                                        ;        
  26.         (setvar "osmode"64)
  27.     (setq p1 (getpoint "\n指定起始手孔:"))                                                                        ;
  28.         (while p1
  29.         (WHILE (/= b nil)                                                                                                        ;当输入弧度为空时,退出程序
  30.                 (SETVAR "osmode" 0)
  31.                 (SETQ b (GETANGLE "\n输入角度(按回车退出):" p1))
  32.                 (IF (/= b nil)                                                                                                        ;如果弧度不为空
  33.                         (PROGN
  34.                                 (SETQ ang (ATOI (ANGTOS b)))                                                        ;将弧角度转换为角度
  35.                                 (SETQ d0 50)                                                                                                
  36.                                 (WHILE (/= d0 nil)                                                                                ;当输入距离为0时,退出循环,继续询问角度        
  37.                                         (SETQ d0 (GETREAL "\n输入距离(按回车输入角度):"))                ;
  38.                                         (IF (AND (/= d0 nil) (> d0 0))                                                ;当距离不为0时
  39.                                                 (PROGN                                                                                                
  40.                                                         (SETQ d (/ d0 r))                                                        ;计算实际插入点R        
  41.                                                         (SETQ p2 ( POLAR p1 b d))                                        ;计算第二手孔插入点
  42.                                                         (COMMAND "insert" a p2 "" "" "")                        ;插入手孔              
  43.                                                         (SETQ xp1( POLAR p1 (ANGLE p1 p2) 2.6))                ;计算管道起点
  44.               (command "ROTATE" (entlast) "" p2 xp1)
  45.                                                  (SETQ xp2( POLAR p2 (ANGLE p2 p1) 2.7))                ;计算管道终点
  46.                                                         (COMMAND "pline" xp1 xp2 "")                                ;画管道
  47.                                                                                                                                                ;========================
  48.                                                        (SETQ dis (DISTANCE P1 P2))                                        ;计算管道中点
  49.                                                        (SETQ pm (POLAR p1 b (/ dis 2)))                        ;pm为管道中点
  50.                                                        (SETQ tang (REM ang 360))                                        ;计算标注文字方向(角度)
  51.                                                        (IF (< tang 0 )                                                                ;如果角度是负值
  52.                                                                 (SETQ tang ( + 360 tang))                                ;转化为正值        
  53.                                                        );endif        
  54.                                                        (SETQ ta (ANGTOF (RTOS tang)))                                ;将方向角度转换为弧度        
  55.                                                        (IF (AND (> tang 105) (< tang 285))                        ;如果标注方向在105 -- 285度之间
  56.                                                                (PROGN                                                                        ;转换到-90 -- 90度之间        
  57.                                                                        (SETQ tang (- tang 180))
  58.                                                                        (SETQ ta (ANGTOF (RTOS tang)))
  59.                                                                );end of progn
  60.                                                        );endif
  61.                                                        (SETQ pd (POLAR pm (+ 1.5707963 ta) 2.2))        ;计算文字插入点
  62.                                                        (SETQ int_d (ATOI (RTOS d0 2 1)))
  63.                                                        (IF (EQUAL (* d0 10) (* int_d 10))
  64.                                                                (SETQ txt (RTOS d0 2 0))                                ;将距离转换为字符串
  65.                                                                (SETQ txt (RTOS d0 2 1))
  66.                                                        );endif
  67.                                                 (COMMAND "text" "J" "M" pd "2" tang txt)        ;以中点对齐方式标注距离
  68.                                                                                                                                          ;=========================        
  69.                                                  (SETQ p1 p2)                                                                ;将P2点坐标赋予P1,将第二手孔坐标作为下次循环的第一手孔坐标
  70.                                          );end of progn
  71.                                          (IF (AND (/= nil d0) (<= d0 0))
  72.                                                  (PROMPT "\n错误!输入的距离小于0,重新输入。")
  73.                                          );endif
  74.                                  );endif
  75.                          );end while
  76.                  );end of progn
  77.          );endif
  78.      );end while
  79.     (SETQ P1 NIL)
  80.           );end while P1
  81.         (SETQ R0 NIL)
  82.         (SETVAR "cecolor" ceco )                                                                                ;恢复系统变量
  83.     (SETVAR "plinewid" pw )                                                                                        ;恢复原PLINE线宽
  84.     (SETVAR "osmode" osmo )                                                                                        ;恢复系统捕捉模式
  85.     (PROMPT "\n结束管道绘制。")
  86. (setq a1 nil)
  87. );end while a
  88. )

发表于 2014-2-12 16:13 | 显示全部楼层
(command "align" ent "" px01 pxt1 px02 pxt2 "" "")
;;ent为(car(entsel))图元名或(ssget)的选择集
;;px01 对齐的第一点基点  pxt1 对齐的第一点目标点
;;px02 对齐的第二点基点  pxt2 对齐的第二点目标点
;;一般二维图形对齐两个点即可,三维的还要指定第三点。

关于command命令参数,实际就是命令时按提示依次输入就可以。有的版本不一样,提示的也不一样。
(command "line" pt1 pt2 "")
(command "move" ss "" pt1 pt2 )
对于没写过的命令,自己在命令行输入一遍,记下操作顺序和词语即可。
发表于 2014-2-12 16:34 | 显示全部楼层
找到线的两点的角度 就好办

















承接CAD二次开发项目(价格实惠)
QQ:2363673534
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-11 18:00 , Processed in 0.189921 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表