999999 发表于 2021-12-19 00:08:29

(求助)请教一下各位大神,有没有插件可以直接实现以下图片的效果

麻烦路过的大神,能不能帮帮小弟实现以下图片的功能:
输入命令>选择对象>确认   这个功能的表达,不知道怎么去表达,就是类似,生成外轮廓与内轮廓,又感觉像是选中的图形交点修剪

夏生生 发表于 2021-12-19 00:08:30

本帖最后由 夏生生 于 2021-12-19 04:43 编辑



未做任何系统变量的处理,自己处理一下,完成状态为region,要lwpolyline的话,自己写一下后续,很简单,用炸开,pedit命令就行。


999999 发表于 2021-12-19 08:42:00

夏生生 发表于 2021-12-19 04:28
未做任何系统变量的处理,自己处理一下,完成状态为region,要lwpolyline的话,自己写一下后续,很简单 ...

大神,请问这个目前需要框选两次能实现这种效果,是否可以实现框选一次就实现呢

tigcat 发表于 2021-12-19 09:33:57

这个类似建筑结构中的梁线剪裁

999999 发表于 2021-12-19 09:57:07

这个是根据最佳答案的大神的代码改了一下,一开始支持高版本,需要框选两次,用在07上没有用,会有错误提示,我把command -s后面的-s删除了,就可以用了,而且还变成了框选一次就可以生成最终效果了,谢谢1楼大神的代码,我感觉找到了新天地,我还不知道是什么原理呢,哈哈,莫名奇妙的根据07版本的提示,删了一下,就更好了

999999 发表于 2021-12-19 09:58:49

tigcat 发表于 2021-12-19 09:33
这个类似建筑结构中的梁线剪裁

行业不一样,但是很多小功能,还是一样的

tigcat 发表于 2021-12-19 10:09:04

999999 发表于 2021-12-19 09:58
行业不一样,但是很多小功能,还是一样的

;不知道作者是谁,贴出交流下
(defun c:cut_new (/   ssns   i      pset   oldosen
      ed   p1p2   plistintSET pi1    pi2
      eni   intseti       j      pjlist pj1    pj2
      enj   intpdis12midpoint       intlist
      midSET npmidlbmidrt
   )
(command "undo" "group")
(if (= fixdist_1 nil)
    (setq fixdist_1 400)
)
(princ "\n请输入控制间距,即平面图中最大梁宽) <")
(princ fixdist_1)
(princ ">:")
(setq fixdist (getint))
(if (= fixdist nil)
    (setq fixdist fixdist_1)
)
(setq fixdist_1 fixdist)
(setq ss (ssget (list (cons 0 "LINE"))))

(setq ns (sslength ss))
(setq i 0)
(setq pset nil)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)

          ;得到线的端点集
(while (< i ns)
    (progn
      (setq en (ssname ss i))
      (setq ed (entget en))
      (setq p1 (cdr (assoc 10 ed)))
      (setq p2 (cdr (assoc 11 ed)))
      (setq plist (list p1 p2 en))
      (setq pset (cons plist pset))
      (setq i (1+ i))
    )
)

          ;得到线的交点
(setq intSET nil)
(setq i 0)
(while (< i ns)
    (progn
      (setq plist (nth i pset))
      (setq pi1(nth 0 plist)
      pi2(nth 1 plist)
      eni(nth 2 plist)
      )
      (setq intseti nil)
      (setq j 0)
      (while (< j ns)
(progn
    (if (= i j)
      (setq j (1+ j))
      (progn
      (setq pjlist (nth j pset))
      (setq pj1(nth 0 pjlist)
      pj2(nth 1 pjlist)
      enj(nth 2 pjlist)
      )
      (if (setq intp (inters pi1 pi2 pj1 pj2))
          ;如果有交点,则存入交点集
    (progn
      (setq intlist (list intp enj))
      (setq intseti (cons intlist intseti))
;;;            (princ intseti)
;;;            (princ "\n")
    )
      )
      (setq j (1+ j))
      )
    )
)
      )
          ;排序
      (setq
intseti(vl-sort
      intseti
      (function (lambda (e1 e2)
            (or (< (car (car e1)) (car (car e2)))
          (< (cadr (car e1)) (cadr (car e2)))
            )
          )
      )
    )
      )
      (setq intseti (cons eni intseti))
      (setq intSET (cons intseti intSET))
;;;   (princ intSET)
;;;   (princ "\n")
      (setq i (1+ i))
    )          ;结束progn
)          ;结束while i<ns

          ;求距离小于限值的线段的中点集
(setqi 0
midSET nil
)
(while (< i ns)
    (progn
      (setq intseti (nth i intSET))
      (setq j1
      np(length intseti)
      eni(car intseti)
      )
      (setq pj1 (car (nth j intseti)))
      (setq j 2)
      (while (< j np)
(progn
    (setq pj2 (car (nth j intseti)))
    (setq dis12 (distance pj1 pj2))
    (if (< dis12 fixdist)
      (progn
      (setq midpoint (mid pj1 pj2))
;;;       (setq midSET (cons midpoint midSET))
;;;       (princ "\nThe midpoint is :\n")
;;;       (princ midpoint)
      (setq midlb (list(- (nth 0 midpoint) (/ dis12 10.0))
      (- (nth 1 midpoint) (/ dis12 10.0))
      (nth 2 midpoint)
      )
      midrt (list(+ (nth 0 midpoint) (/ dis12 10.0))
      (+ (nth 1 midpoint) (/ dis12 10.0))
      (nth 2 midpoint)
      )
      )
      (command "break" (ssget "c" midlb midrt) pj1 pj2)
      )
    )
    (setq pj1 pj2)
    (setq j (1+ j))
)
      )
      (setq i (1+ i))
    )
)

;;; (princ "\nThe result is:\n")
;;; (princ intSET)
;;; (princ "\n")
(setvar "osmode" oldos)
(command "undo" "end")
(princ)
;;;(setq i 0)
;;;(while
)
;;; (setq fn "e:\\temp\\test.txt")
;;; (setq f (open fn "a"))
;;; (princ p1 f)
;;; (princ "\n" f)
;;; (princ p2

(defun mid (p1 p2 / x y)
(setqx (/ (+ (nth 0 p1) (nth 0 p2)) 2)
y (/ (+ (nth 1 p1) (nth 1 p2)) 2)
)
(list x y (nth 2 p1))
)

999999 发表于 2021-12-19 10:20:42

tigcat 发表于 2021-12-19 10:09
;不知道作者是谁,贴出交流下

感谢大神,请问大神能贴一个这个代码的功能作用上来吗?刚刚试了一下,不知道怎么用,,真的很惭愧

pizi158545086 发表于 2021-12-19 10:29:44

999999 发表于 2021-12-19 09:57
这个是根据最佳答案的大神的代码改了一下,一开始支持高版本,需要框选两次,用在07上没有用,会有错误提示 ...

可以帮忙增加全部连接成多段线代码吗谢谢

tigcat 发表于 2021-12-19 15:58:58

本帖最后由 tigcat 于 2021-12-19 16:04 编辑

999999 发表于 2021-12-19 10:20
感谢大神,请问大神能贴一个这个代码的功能作用上来吗?刚刚试了一下,不知道怎 ...
这个就是把相交的梁线打开,应该是只支持直线;然后是如果有缺口应该不能补全缺口.原作者是<AutoLISP在建筑结构设计中的应用>一书的作者刘立平老师.
页: [1] 2
查看完整版本: (求助)请教一下各位大神,有没有插件可以直接实现以下图片的效果