明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: dubs01

怎样将多条直线或曲线分成非常多的小段?

  [复制链接]
 楼主| 发表于 2004-2-8 09:43:00 | 显示全部楼层
非常谢谢斑竹,所有的功能都实现,明经及时解人之所难的精神让我佩服,谢谢了!愿明经的明天更美好!
 楼主| 发表于 2004-2-8 12:45:00 | 显示全部楼层
lockmyeye发表于2004-2-7 22:39:00;;;to dubs01;;;等分对象(DEFUN c:df (/ df_data df_type ename1 ent_last num1 pts ss1) (SETVAR \"cmdecho\" 0) (SETVAR \"osmode\" 0) (COMMAND \"undo\" \"begin\") (PRINC \"

To Lockmyeye斑竹,在使用的过程中发现有个小问题,就是圆没有添加上去,也就是说圆还无法断开,希望斑竹能够继续完善一下,先在此谢谢你了!
发表于 2004-2-8 21:43:00 | 显示全部楼层
从前面加断时,如果是闭合对象,不会生成新对象。 否则要生成新对象的,再设置为新的打断对象。 在(FOREACH pt_break pts
(COMMAND "break" ename1 pt_break pt_break)
)这句,还是要增加一些代码的。
发表于 2004-2-9 20:37:00 | 显示全部楼层
给大家一个好玩的断开程序,不过还很菜只能断开不封闭的LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC ;等分不闭合的线
;2004.2 ljc 唐山
(defun c:d( / line n0 j linex )
(setq line (ssget))
(setq ds(getint "请输入分段长度:"))
(command "ucs" "" "")
(setq n0 (sslength line))
(setq j 0 col 0 n2 0)
(repeat n0
(setq linex (ssname line j))
(command "measure" linex ds "")
(command)
(setq point (ssget "x" '((0 . "point"))))
(setq n (sslength point))
(setq i 0 )
(repeat n
(setq p1 (cdr(assoc 10 (entget(ssname point i)))))
(command "erase" (ssname point i) "")
(command "zoom" "w" (polar p1 (* pi 0.75) ds ) (polar p1 (* pi -0.25) ds ) )
(command "break" (list (car p1) (cadr p1) (caddr p1)) "@" )
(setq col (1+ col))
(if (= 7 col) (setq col 1))
(command "change" (entlast) "" "p" "c" col "")
(setq n2 (1+ n2))
(if (= 19 n2) (setq n2 1))
(command "polygon" (+ n2 2) p1 "c" (* (/ ds 20.0) n2) )
(command "change" (entlast) "" "p" "c" col "")
(command "erase" (entlast) "")
(setq i (+ i 1))
(setq n2 (1+ n2))
(if (= 19 n2) (setq n2 1))
(command "text" "j" "mc" p1 (* (/ ds 60.0) n2) 0 "明经通道" "" )
(command "change" (entlast) "" "p" "c" col "")
(command "erase" (entlast) "")
)
(setq j (+ j 1))
)
(command "zoom" "e" "")
)
发表于 2004-2-9 21:09:00 | 显示全部楼层
浮上水面,发个定数和定距等分浓缩版
  1. ;;;曲线断开程序;;;绝情一剑,2004.2.8(defun c:dk (/ ss int getdst obj getdiv ssnm pt i getds)
  2. (setq ss (ssget '((0 . "LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC"))) i 0)
  3. (initget (+ 1 2 4))
  4.    (setq int (getint "\n定数等分<直接输入等分数>/定距等分<按键盘数字1>:"))
  5.    (if (= int 1)(setq getdst (getdist "\n***输入要等分的距离<可直接量取>***:")))
  6. (repeat (sslength ss)
  7. (setq obj (vlax-ename->vla-object(setq ssnm (ssname ss i))))
  8.   (cond
  9.      ((= int 1) (setq getdiv getdst)(setq int (+(fix(/ (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj)) getdst))1)))   
  10. (t (setq getdiv (/(vlax-curve-getdistatparam obj (vlax-curve-getendparam obj))int)))
  11.            )
  12. (repeat (- int 1)
  13.    (setq getds (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj)))
  14. (vl-cmdf ".break"   ssnm (setq pt (vlax-curve-getPointAtDist obj (- getds getdiv))) pt)   
  15.    )
  16.    (setq i (+ i 1))
  17.    )(princ)
  18. )
发表于 2004-2-10 01:27:00 | 显示全部楼层
注意: obj打断一次后生成新物体,原物体变短,再次用obj可能得不到想要的点。所有出错
发表于 2004-2-10 01:46:00 | 显示全部楼层
  1. ;;;to dubs01
  2. ;;;等分对象
  3. (DEFUN c:df (/ df_data df_type ename1 ent_last num1 pts ss1 vobj1)
  4.        (SETVAR "cmdecho" 0)
  5.        (SETVAR "osmode" 0)
  6.        (COMMAND "undo" "begin")
  7.        (IF (SETQ num1 0
  8.                            ss1   (SSGET '((0 . "LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE")))
  9.                )
  10.                (PROGN
  11.                        ;;df_type 等分类型:MEASURE定数 DIVIDE定距
  12.                        ;;df_data 等分数据:保存等分距离(定距等分时)或等分数目(定数等分时)
  13.                        (INITGET 7 "Divide")
  14.                        (IF (= "Divide" (SETQ df_data (GETREAL "\n指定等分线段长度或 [定数等分(Divide)]:")))
  15.                                (PROGN
  16.                                        (SETQ df_type df_data)
  17.                                        (WHILE (PROGN
  18.                                                              (INITGET 7)
  19.                                                              (< (SETQ df_data (GETINT "\n输入线段数目:")) 2)
  20.                                                      )
  21.                                                (PRINC "\n需要 2 和 32767 之间的整数")
  22.                                        )
  23.                                )
  24.                                (SETQ df_type "Measure")
  25.                        )
  26.                        (REPEAT (SSLENGTH ss1)
  27.                                (COMMAND "point" '(0 0 0))
  28.                                (SETQ ename1     (SSNAME ss1 num1)
  29.                                            vobj1       (VLAX-ENAME->VLA-OBJECT ename1)
  30.                                            num1         (1+ num1)
  31.                                            ent_last (ENTLAST)
  32.                                            pts           nil
  33.                                )
  34.                                (COMMAND df_type ename1 df_data)   ;生成等分点
  35.                                (WHILE (SETQ ent_last (ENTNEXT ent_last))
  36.                                        (SETQ pts (CONS (CDR (ASSOC '10 (ENTGET ent_last))) pts))
  37.                                )
  38.                                (COMMAND "undo" "2")                           ;回退刚才的生成命令
  39.                                (COND
  40.                                        ((EQUAL (CAR pts) (VLAX-CURVE-GETENDPOINT vobj1))
  41.                                          (SETQ pts (CDR pts))
  42.                                        )
  43.                                        ((EQUAL (LAST pts) (VLAX-CURVE-GETSTARTPOINT vobj1))
  44.                                          (SETQ pts (REVERSE (CDR (REVERSE pts))))
  45.                                        )
  46.                                ) ;_如果首尾打断点在曲线起止点时,去除此点
  47.                                ;;对闭合的"AcDbEllipse,AcDbSpline,AcDbCircle"对象处理
  48.                                (IF (AND (VLAX-CURVE-ISCLOSED vobj1)
  49.                                                  (WCMATCH (VLA-GET-OBJECTNAME vobj1) "AcDbEllipse,AcDbSpline,AcDbCircle")
  50.                                        )
  51.                                        (PROGN
  52.                                                (COMMAND "COPY" ename1 "" "0,0" "0,0")
  53.                                                (COMMAND "break" (ENTLAST) (VLAX-CURVE-GETSTARTPOINT vobj1) (CAR pts))
  54.                                                (COMMAND "break" ename1 (CAR pts) (VLAX-CURVE-GETSTARTPOINT vobj1))
  55.                                                (SETQ pts (CDR pts))
  56.                                        )
  57.                                )
  58.                                (FOREACH pt_break pts
  59.                                        (COMMAND "break" ename1 pt_break pt_break)
  60.                                )
  61.                        )
  62.                )
  63.        )
  64.        (COMMAND "undo" "end")
  65.        (PRINC)
  66. )
复制代码
看看还有什么地方要完善。
 楼主| 发表于 2004-2-10 09:14:00 | 显示全部楼层
谢谢斑竹,这个程序现在非常完善了,所有的都能断开了,非常的谢谢Lockmyeye斑竹,不光名字好,心肠也好,更主要的是水平高!谢谢了!
发表于 2004-2-10 13:46:00 | 显示全部楼层
Command: ds DIST Specify first point: Specify second point:
Command: u DIST
Command: U ZOOM
Command: U GROUP
Command: df
Select objects: Specify opposite corner: 8 found Select objects:
指定等分线段长度或 [定数等分(Divide)]:500 No object found
No object found
No object found
No object found
No object found
No object found
No object found
No object found
........(多个)
No object found At least one break point must be on polyline.*Invalid* 错误: 函数被取消
发表于 2012-6-26 22:09:30 | 显示全部楼层
虽然时间有点长了,但还是一个很经典的定数定距等分程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-22 03:59 , Processed in 0.191015 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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