xiaxiang 发表于 2011-10-31 10:44:00

剪切穿过圆的图元,如何判断剪切圆内还是圆外(已解决)

本帖最后由 xiaxiang 于 2011-10-31 16:51 编辑


如图,很简单,一根line穿过了circle。
我现在想执行剪切命令,通过偏移,栏选,剪切的永远是圆内的线。
如果我要剪圆外的线,应该如何操作?
当然,办法有很多。内外剪切的程序也有很多。只是想知道最直接,简练的一种,我不用判断图元与圆的关系,更不用去打断。我只要偏移,栏选。可能吗?
纠结了一上午?多谢施与援手。
2011.10.31 下午17:00
问题已解决,剪切边界的问题,低级错误!居然把边界搞错了。
用点集解决问题的方法请见12#。
剪切必须执行两次的bug,看来还是Autodesk的问题。
再次谢谢大家!

Qwer1243 发表于 2024-5-6 19:06:23

yjr111 发表于 2011-11-6 19:18
从收集的源码里找到的,剪切矩形框内的线,和你这放一起。。。不知道谁写的。。。

感谢分享,很好用的代码

Andyhon 发表于 2011-10-31 10:53:23

单依此例
线两端各点选一次即得

xiaxiang 发表于 2011-10-31 11:28:01

举一个简单例子,我通过下面程序可以实现圆内剪切。我能通过修改实现圆外剪切吗?
原理是圆上做点,栏选剪切,比较简单。
欢迎指点。

(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)
)

xiaxiang 发表于 2011-10-31 11:30:04

Andyhon 发表于 2011-10-31 10:53 static/image/common/back.gif
单依此例
线两端各点选一次即得

谢谢Andyhon ,但我只想要单选一次圆就能得到正确结果

Andyhon 发表于 2011-10-31 12:15:20

重新定义 circ_pts 即可
让点集砌成外切多边形

xiaxiang 发表于 2011-10-31 14:33:52

本帖最后由 xiaxiang 于 2011-10-31 14:47 编辑

Andyhon 发表于 2011-10-31 12:15 http://bbs.mjtd.com/static/image/common/back.gif
重新定义 circ_pts 即可
让点集砌成外切多边形

没搞明白,这样剪切还是剪的外切多边形内部的线?
我用圆分别做内偏移和外偏移来剪切,得出的结果都是只剪切内部的线。
最奇怪的是曾经得出过正确的结果。不可能受系统变量的影响嘛。

yjr111 发表于 2011-10-31 14:49:56

这种曲线事情直接找highflybir,问我浪费时间

Andyhon 发表于 2011-10-31 14:56:49

...都是只剪切内部的线...
请上传更新后的代码+调试用的文件(*.Dwg)

highflybir 发表于 2011-10-31 15:40:34

(polar cenang(+ rad eps))
之类的可以让你直接取得圆内或者圆外的一点.

xiaxiang 发表于 2011-10-31 16:09:08

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
查看完整版本: 剪切穿过圆的图元,如何判断剪切圆内还是圆外(已解决)