明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[提问] 请教点击两个块(基本为同名块) 中间定数等分

[复制链接]
 楼主| 发表于 2020-3-12 15:26:40 | 显示全部楼层
本帖最后由 xj6019 于 2020-3-12 15:29 编辑

行吧,那就选点吧,上面我贴的那个代码,能不只是水平吗,可以改成任意方向不,还有你的代码为什么加载会错误啊,能更新一下吗,两个都能用了最好,我试用一下,哪个顺手最后用哪个吧
回复

使用道具 举报

发表于 2020-3-12 15:54:37 | 显示全部楼层
如果你的图块是标准没乱搞的肯定是等分那个好用,我加载没错,不知道你什么原因

(defun c:tt5  (/ ang en pt1 pt2 ptx sl xfx zljl)
(setvar 'cmdecho 0)
(setq en (car(entsel "\n选择对象:")))
(setq pt1 (getpoint "\n指定第一点:"))
(setq pt2 (getpoint pt1 "\n指定第二点:") ang (angle pt1 pt2))
(setq sl (getint "输入间隔数<2>:") )
(if (not sl) (setq sl 2))
(setq zljl (/ (distance pt1 pt2) sl))       
(repeat (1- sl) (command "COPY" en "" "non" pt1 "non" (setq ptx (polar pt1 ang zljl)))
(setq pt1 ptx en (entlast)))       
(setvar 'cmdecho 1)
(princ)
)
回复

使用道具 举报

 楼主| 发表于 2020-3-12 16:12:13 | 显示全部楼层
本帖最后由 xj6019 于 2020-3-12 19:34 编辑
start4444 发表于 2020-3-12 15:54
如果你的图块是标准没乱搞的肯定是等分那个好用,我加载没错,不知道你什么原因

(defun c:tt5  (/ ang e ...

你的代码知道什么原因了,普通块是没问题的,我试过了,但是我需要等分的都是动态块,可否代码稍微变动一下,支持一下动态块啊
回复

使用道具 举报

 楼主| 发表于 2020-3-12 16:42:16 | 显示全部楼层
说错了,是动态块不行,上面图片是我自己制作的几个自己比较常用的三个动态块。

顺便试了一下属性块,好像也不行。求帮助,主要用于上面三个形状,每天都用,属性块基本用不到吧
回复

使用道具 举报

 楼主| 发表于 2020-3-12 17:50:27 | 显示全部楼层
本帖最后由 xj6019 于 2020-3-12 17:52 编辑
start4444 发表于 2020-3-11 22:11
出错应该是块名匿名了,动态块就还是用复制吧,有多种形态不好判断,只要你两个块一样就没啥问题。
(def ...

试过了,同名的已经全部没有问题了,如果两端不重名就没法捕捉中点,位置和期望的不同,因此换个思路试试,以下代码是论坛里面你的代码,在此基础上略微变一下好吗,选取一根直线,两端固定缩短各50,中间部分等分,运行的话,选线,输入间隔数,回车完成!插入的块代码里面临时起名aabb  我自己改就行,这样应该更好用一点,如果能判断两端是否有重叠的只保留一个,多余的删掉,能做到最好,今天有耽误你不少时间,谢谢了!

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=179362&highlight=%CB%F5%B6%CC

(defun c:tt5 ()
        (vl-load-com)
        (setq dd (getdist "\n输入头尾缩短距离:") dd2 (getdist "\n输入最大间隔距离:") bname (cdr (assoc 2 (entget (car (entsel "\n请选取图块:"))))))
        (setq en (car (entsel "\n请选取多段线:")) ent (entget en) plist (vertexs en) p1 (car plist) plast (last plist) p2 (cadr plist))
        (setq obj (vlax-ename->vla-object  en))
        (setq zd (abs (- (vlax-curve-getDistAtPoint obj p1) (vlax-curve-getDistAtPoint obj plast))) zdnew (- zd (* dd 2)))
        (setq i 1)
  (while (> (/ zdnew i) dd2 (setq i (1+ i))))
        (setq med (/ zdnew i))
        (entmake (list '(0 . "CIRCLE") (cons 10 p1) (cons 40 dd) (cons 62 8))) (setq cr1 (entlast))
  (entmake (list '(0 . "CIRCLE") (cons 10 plast) (cons 40 dd) (cons 62 8))) (setq crlast (entlast))
        (command "copy" en "" "non" (list 0 0) "non" (list 0 0) "TRIM" cr1 crlast "" (list en p1)  (list en plast) "" )
        (command "MEASURE" en "B" bname "Y" med "INSERT" bname "non" (cdr (assoc 10 (entget en))) "" "" "non" p2 "ERASE" en cr1 crlast "")
        (princ)
)
;;多段线顶点表
(defun vertexs (ename / plist pp n)
  (setq obj (vlax-ename->vla-object ename))
  (setq plist (vlax-safearray->list
                                                                (vlax-variant-value
                                                                        (vla-get-coordinates obj))))
  (setq n 0)
  (repeat (/ (length plist) 2)
    (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
    (setq n (+ n 2))
  )
  pp
)
回复

使用道具 举报

发表于 2020-3-12 18:52:10 | 显示全部楼层
不知道什么原因,好多程序只支持多义线,不支持单条直线?
回复

使用道具 举报

发表于 2020-3-13 12:01:13 | 显示全部楼层
xj6019 发表于 2020-3-12 17:50
试过了,同名的已经全部没有问题了,如果两端不重名就没法捕捉中点,位置和期望的不同,因此换个思路试试 ...

根据昨天那几段代码完全就能搞出来了:根据直线两端点算出缩短的两头点,再套两点那段代码进去就成了

点评

嗯 已经当时够用的了,手里工作有点着急,先赶紧搞搞活,空下来的时候研究研究搞搞,谢谢了哦  发表于 2020-3-13 12:17
回复

使用道具 举报

发表于 2020-9-12 20:05:32 | 显示全部楼层
谢谢各位大神的讨论,以及楼主的想法,,想法越多,工作起来就越轻松
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-26 15:04 , Processed in 0.168725 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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