剪切穿过圆的图元,如何判断剪切圆内还是圆外(已解决)
本帖最后由 xiaxiang 于 2011-10-31 16:51 编辑如图,很简单,一根line穿过了circle。
我现在想执行剪切命令,通过偏移,栏选,剪切的永远是圆内的线。
如果我要剪圆外的线,应该如何操作?
当然,办法有很多。内外剪切的程序也有很多。只是想知道最直接,简练的一种,我不用判断图元与圆的关系,更不用去打断。我只要偏移,栏选。可能吗?
纠结了一上午?多谢施与援手。
2011.10.31 下午17:00
问题已解决,剪切边界的问题,低级错误!居然把边界搞错了。
用点集解决问题的方法请见12#。
剪切必须执行两次的bug,看来还是Autodesk的问题。
再次谢谢大家!
yjr111 发表于 2011-11-6 19:18
从收集的源码里找到的,剪切矩形框内的线,和你这放一起。。。不知道谁写的。。。
感谢分享,很好用的代码 单依此例
线两端各点选一次即得 举一个简单例子,我通过下面程序可以实现圆内剪切。我能通过修改实现圆外剪切吗?
原理是圆上做点,栏选剪切,比较简单。
欢迎指点。
(defun c:ctrim ( / circ_pts lst ang inc tmp seg pt ent
ctrim_err x f_pts svd_os svd_cmd svd_err)
(defun ctrim_err (s)
(if(/= s "Function cancelled")
(princ(strcat "\n\n" s)) )
(setvar "cmdecho" svd_cmd)
(setvar "osmode" svd_os)
(setq *error* svd_err)
)
(defun circ_pts (enm)
(setq lst (entget enm)
ang (* pi 2)
inc (/ ang 64)
tmp '()
seg 65
)
(repeat seg
(setq pt (polar(cdr(assoc 10 lst))ang
(-(cdr(assoc 40 lst))0.01))
ang (+ inc ang)
)
(setq tmp(cons pt tmp))
)
tmp
)
(setq ent (car(entsel "\nSelect circle: "))
svd_err *error*
*error* ctrim_err
svd_os(getvar "osmode")
svd_cmd (getvar "cmdecho")
)
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(if(and ent
(=(cdr(assoc 0(entget ent)))"CIRCLE")
)
(progn
(setq f_pts(circ_pts ent))
(command "trim" ent "" "f")
(foreach x f_pts(command x))
(command "" "")
)
)
(setvar "cmdecho" svd_cmd)
(setvar "osmode" svd_os)
(setq *error* svd_err)
(princ)
)
Andyhon 发表于 2011-10-31 10:53 static/image/common/back.gif
单依此例
线两端各点选一次即得
谢谢Andyhon ,但我只想要单选一次圆就能得到正确结果 重新定义 circ_pts 即可
让点集砌成外切多边形 本帖最后由 xiaxiang 于 2011-10-31 14:47 编辑
Andyhon 发表于 2011-10-31 12:15 http://bbs.mjtd.com/static/image/common/back.gif
重新定义 circ_pts 即可
让点集砌成外切多边形
没搞明白,这样剪切还是剪的外切多边形内部的线?
我用圆分别做内偏移和外偏移来剪切,得出的结果都是只剪切内部的线。
最奇怪的是曾经得出过正确的结果。不可能受系统变量的影响嘛。
这种曲线事情直接找highflybir,问我浪费时间 ...都是只剪切内部的线...
请上传更新后的代码+调试用的文件(*.Dwg) (polar cenang(+ rad eps))
之类的可以让你直接取得圆内或者圆外的一点. Andyhon 发表于 2011-10-31 14:56 static/image/common/back.gif
...都是只剪切内部的线...
请上传更新后的代码+调试用的文件(*.Dwg)
感谢Andyhon。犯了低级错误,用偏移后的圆作为边界,肯定会得到错误的结果。上传单向偏移的代码,可以剪切圆外部
(defun c:ctrim ( / circ_pts lst ang inc tmp seg pt ent
ctrim_err x f_pts svd_os svd_cmd svd_err)
(defun ctrim_err (s)
(if(/= s "Function cancelled")
(princ(strcat "\n\n" s)) )
(setvar "cmdecho" svd_cmd)
(setvar "osmode" svd_os)
(setq *error* svd_err)
)
(defun circ_pts (enm)
(setq lst (entget enm)
ang (* pi 2)
inc (/ ang 64)
tmp '()
seg 65
)
(repeat seg
(setq pt (polar(cdr(assoc 10 lst))ang
(-(cdr(assoc 40 lst))0.01))
ang (+ inc ang)
)
(setq tmp(cons pt tmp))
)
tmp
)
(defun meoffset (obj dst / tmplst)
(if (not (vl-catch-all-error-p (setq tmplst (vl-catch-all-apply 'vlax-invoke (list obj 'offset dst)))))
tmplst
)
)
(setq ent (car(entsel "\nSelect circle: "))
svd_err *error*
*error* ctrim_err
svd_os(getvar "osmode")
svd_cmd (getvar "cmdecho")
)
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(if(and ent
(=(cdr(assoc 0(entget ent)))"CIRCLE")
)
(progn
(meoffset (vlax-ename->vla-object ent) 0.1)
(setq f_pts(circ_pts (entlast)))
(repeat 2
(command "trim" ent "" "f")
(foreach x f_pts(command x))
(command "" "")
)
(command "erase" (entlast) "")
)
)
(setvar "cmdecho" svd_cmd)
(setvar "osmode" svd_os)
(setq *error* svd_err)
(princ)
)
但是又有新的问题。为何此处非要执行两次?一次只能剪切一边,奇哉怪也。有兴趣的帮忙测试一下啊。谢谢
(repeat 2
(command "trim" ent "" "f")
(foreach x f_pts(command x))
(command "" "")
)
页:
[1]
2