世人皆醉 发表于 2022-8-5 10:49:52

如何在直线两段生成小点点

问题如图所示,求大佬告知!!!


mituzhe 发表于 2022-8-5 10:49:53

本帖最后由 mituzhe 于 2022-8-9 14:47 编辑


重新复制了一遍代码,顺便了解了怎么添加代码区域,哈哈

;-------------------------------------------------------------------------------------------------
;直线端点标记
(defun c:tt1 (/ ang line_ctrl_pts lyr pt1 pt2 ss_line)
(setq ss_line (ssget '((0 . "LWPOLYLINE,LINE"))))
(foreach ent (xyp-Ss2List ss_line)
    (setq line_ctrl_pts (gd-getCtrlPt ent)
          lyr         (vla-get-layer (vlax-ename->vla-object ent))
    )
    (if (wcmatch (cdr (assoc 0 (entget ent))) "*POLYLINE")
      (progn
      ; (setq line_ctrl_pts (mapcar '(lambda (pt) (append pt '(0.0)))
      ;                           line_ctrl_pts
      ;                     )
      ; )
      (setq line_ctrl_pts (mapcar 'list line_ctrl_pts (cdr line_ctrl_pts)))
      )
    )
    (foreach pts line_ctrl_pts
      (setq pt1 (nth 0 pts)
            pt2 (nth 1 pts)
            ang (angle pt1 pt2)
      )
      (entmake
      (mapcar 'cons '(0 8 62 10 11) (list "LINE" lyr 2 pt1 (polar pt1 ang 1)))
      )
      (entmake
      (mapcar 'cons
                '(0 8 62 10 11)
                (list "LINE" lyr 2 pt2 (polar pt2 (+ ang PI) 1))
      )
      )
    )

    (entdel ent)
)
(princ)
)

(defun xyp-Ss2List (ss / i s1 lst)
(and ss
       (setq i -1)
       (while (setq s1 (ssname ss (setq i (1+ i))))
         (setq lst (cons s1 lst))
       )
)
lst
)
(defun gd-getCtrlPt (ent / ctrlPt_lst)
; (setq ctrlPt_lst nil)

(setq ctrlPt_lst (append
                     (vl-remove-if-not
                     '(lambda (x) (or (= 11 (car x)) (= 10 (car x))))
                     (entget ent)
                     )
                     ctrlPt_lst
                   )
)
; (print ctrlPt_lst)

(mapcar 'cdr ctrlPt_lst)
)

llsheng_73 发表于 2022-8-5 11:23:26

点是没有方向的,你要的小点点是不是一个长度为1mm的多段线或者块参照,起点是直线的端点,止点指向另一端?

guosheyang 发表于 2022-8-5 13:48:30

你这个 先求端点坐标   然后 polar   求另一点然后画直线改为黄色   计算两次即可

世人皆醉 发表于 2022-8-5 13:54:04

本帖最后由 世人皆醉 于 2022-8-5 14:01 编辑

llsheng_73 发表于 2022-8-5 11:23
点是没有方向的,你要的小点点是不是一个长度为1mm的多段线或者块参照,起点是直线的端点,止点指向另一端 ...
就是个一毫米的线,对的,就是起点是直线的端点,指点是指向另一端

xj6019 发表于 2022-8-5 15:05:31

你这是要弄打标线吗?两个端部不需要先往内部缩进个0.5后 再画1mm的线吗?

mituzhe 发表于 2022-8-5 15:07:36

本帖最后由 mituzhe 于 2022-8-5 16:34 编辑

;-------------------------------------------------------------------------------------------------
;直线端点标记
(defun c:tt1 (/ ang line_ctrl_pts pt1 pt2 ss_line)
(setq ss_line (ssget'((0 . "*LINE"))))
(foreach ent (xyp-Ss2List ss_line)
    (setq line_ctrl_pts (gd-getCtrlPt ent)
          pt1         (nth 0 line_ctrl_pts)
          pt2         (nth 1 line_ctrl_pts)
          ang         (angle pt1 pt2)
    )
    (entmake
      (list (cons 0 "LINE")
            (cons 62 2)
            (cons 10 pt1)
            (cons 11 (polar pt1 ang 1))
      )
    )
    (entmake
      (list (cons 0 "LINE") (cons 62 2) (cons 10 pt2) (cons 11 (polar pt2 (+ ang PI) 1)))
    )
    (entdel ent)
)
(princ)
)

(defun xyp-Ss2List (ss / i s1 lst)
(and ss
       (setq i -1)
       (while (setq s1 (ssname ss (setq i (1+ i))))
         (setq lst (cons s1 lst))
       )
)
lst
)
(defun gd-getCtrlPt (ent / ctrlPt_lst)
; (setq ctrlPt_lst nil)

(setq ctrlPt_lst (append
                        (vl-remove-if-not
                        '(lambda (x) (or (= 11 (car x)) (= 10 (car x))))
                        (entget ent)
                        )
                        ctrlPt_lst
                      )
)
; (print ctrlPt_lst)

(mapcar 'cdr ctrlPt_lst)
)

世人皆醉 发表于 2022-8-5 15:08:23

xj6019 发表于 2022-8-5 15:05
你这是要弄打标线吗?两个端部不需要先往内部缩进个0.5后 再画1mm的线吗?

不需要的,直接从端点尾部开始的

mituzhe 发表于 2022-8-5 15:20:42

mituzhe 发表于 2022-8-5 15:07
;----------------------------------------------------------------------------------------------- ...

试试这个能不能满足你的要求

mituzhe 发表于 2022-8-5 15:28:54

其实如果只是想要标记顶点位置。可以单独画 点(POINT)图元,可以标记出所有顶点。目前我这个代码,对多段线折线,只能计算第一段,但如果标记点,稍微修改能标记所有位置
页: [1] 2 3
查看完整版本: 如何在直线两段生成小点点