乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 73|回复: 8

[编程交流] 沿路径编号

[复制链接]

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 13:11:38 | 显示全部楼层 |阅读模式
cad有很多很棒的编号程序(即Lee的增量编号或Gile的增量编号)。
但我没有找到任何编号套件,允许我选择路径(即lwpolyline)并根据此路径编号。
下图显示了我想要实现的目标。
141144lqwhttdm6nmlhlt6.jpg
我只有一个问题,如何识别,在我的路径的哪一边是圆到数字(上/下/左/右等)?
对于沿曲线(lwpolyline)排序,我将使用函数vlax curve getClosestPointTo和vlax curve getParamAtPoint。 
现在我们可以假设路径是由line对象生成的。
 
回复

使用道具 举报

2

主题

261

帖子

20

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-5 13:21:41 | 显示全部楼层
你的数字是方块还是圆圈中的文字?
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 13:31:19 | 显示全部楼层
张贴你用来生成它的代码。
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 13:38:43 | 显示全部楼层
@RonJonpt没有代码来生成这个,我手动做了这个来展示我想要实现的
@马拉托维奇在我的画里有圆圈和文字。假设我将使用圆。
通常我只需要知道如何根据所选路径对“行”排序。
回复

使用道具 举报

15

主题

315

帖子

361

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 13:45:34 | 显示全部楼层
我会这样开始。 
它不会告诉你左,右。。。但它告诉你沿着这条路的距离。绘制路径的人,多段线的起点是距离0。这就是低数字应该出现的地方。
如果需要,可以反转。
 
该脚本仅在屏幕上打印该距离(以及其他数据)。你真正的问题是得到这个,对吗?
 
我假设这些圆是具有属性的块。
 
附件中的dwg
 
  1. (defun c:test  (  / ss path i  pt1 pt2 dist blk)
  2.  
  3.   (princ "\nSelect blocks: ")
  4.   (setq ss (ssget  '((0 . "INSERT") ) ))
  5.   (setq path (entsel  "\nSelect Path: "))
  6.  
  7.   (setq i 0)
  8.   (repeat (sslength ss)
  9.  
  10.     (princ "\nBlock number: ")
  11.     (princ i)
  12.     
  13.     (setq blk (ssname ss i))
  14.     (setq pt1 (cdr (assoc 10 (entget blk))) )
  15.     (princ "\nInsert point of block: ")
  16.     (princ pt1)
  17.     (setq pt2 (vlax-curve-getClosestPointTo (car path) pt1))
  18.     (princ "\nClosest point to on path: ")
  19.     (princ pt2)
  20.     
  21.     (setq dist (vlax-curve-getDistAtPoint (car path) pt2) )
  22.     (princ "\nClosest distance to path: ")
  23.     (princ (distance pt1 pt2))
  24.     (princ "\nDistance along path: ")
  25.     (princ dist)
  26.     
  27.     (princ "\n")
  28.     (setq i (+ i 1))
  29.     
  30.   )  
  31.   (princ)
  32. )
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 13:51:29 | 显示全部楼层
不是很漂亮,但这可能会给你一个开始。它当前插入文本。
 
  1. (defun c:foo (/ a aa b c d e l ll n p pa)
  2.   ;; RJP » 2018-10-12
  3.   ;; Divides a polyline into segments then divides another distance at each of those
  4.   ;; points while incrementing a number by 1. Polyline direction will dictate what
  5.   ;; side the numbering starts on. Happy Friday!
  6.   (cond
  7.     ((and (setq e (car (entsel "\nPick your centerline: ")))
  8.           (= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
  9. ;;;          (setq a (getint "\nEnter number of segments to place on centerline: "))
  10. ;;;          (setq b (getdist "\nEnter length for each segment: "))
  11. ;;;          (setq c (getint "\nEnter quantity of numbers to place on each segment: "))
  12.           ;; Testing numbers
  13.           (setq        a 50
  14.                 b 25.
  15.                 c 5
  16.           )
  17.      )
  18.      (setq d (vlax-curve-getdistatparam e (vlax-curve-getendparam e)))
  19.      (setq n 0)
  20.      (repeat a
  21.        (cond
  22.          ((setq p (vlax-curve-getpointatdist e n))
  23.           (setq aa (angle '(0 0 0) (vlax-curve-getfirstderiv e (vlax-curve-getparamatpoint e p))))
  24.           (setq n (+ n (/ d (1- a))))
  25.           (setq p (polar p (setq pa (+ aa (/ pi 2.))) (/ b 2.)))
  26.           (entmakex (list '(0 . "line") (cons 10 p) (cons 11 (polar p (+ pi pa) b)) '(8 . "line")))
  27.           (setq l nil)
  28.           (repeat c (setq l (cons p l)) (setq p (polar p (+ pi pa) (/ b (1- c)))))
  29.           (setq ll (cons (reverse l) ll))
  30.          )
  31.        )
  32.      )
  33.      (setq n 0)
  34.      (setq ll (reverse ll))
  35.      (while (car ll)
  36.        (foreach        p (mapcar 'car ll)
  37.          (entmakex (list '(0 . "TEXT")
  38.                          '(100 . "AcDbEntity")
  39.                          '(67 . 0)
  40.                          '(8 . "text")
  41.                          '(100 . "AcDbText")
  42.                          (cons 10 p)
  43.                          (cons 40 (/ (/ b (1- c)) 2.))
  44.                          (cons 1 (itoa (setq n (1+ n))))
  45.                          '(50 . 0.0)
  46.                          '(41 . 1.0)
  47.                          '(51 . 0.0)
  48.                          '(71 . 0)
  49.                          '(72 . 1)
  50.                          (cons 11 p)
  51.                          '(100 . "AcDbText")
  52.                          '(73 . 2)
  53.                    )
  54.          )
  55.        )
  56.        (setq ll (mapcar 'cdr ll))
  57.      )
  58.     )
  59.   )
  60.   (princ)
  61. )

141146t2dbq7rmgg4m7rwi.png
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 13:57:30 | 显示全部楼层
谢谢@ronjonp的小费。
 
(从此帖子排序)
 
例如:
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 14:06:17 | 显示全部楼层
乍一看-
  1. (defun vector (p1 p2)
  2.     (mapcar '(lambda (%1 %2) (- %2 %1) ) p1 p2 )
  3. )
可以写入-
但是在这一点上,您也可以直接内联编写mapcar函数。
 
还有这个-
  1.         (if lst
  2.             (setq lst (cons c lst))
  3.             (setq lst (list c))
  4.         )
可以替换为-
  1. 6
因为当lst为零时(cons c lst)==(list c)。
 
 
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 14:18:05 | 显示全部楼层
@李-新手失误
一些改进:
  1. 7
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 23:30 , Processed in 2.868458 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表