| 本帖最后由 狂刀lxx 于 2012-1-7 14:59 编辑 
 提供一个地6题的简练解答
 
 或者 ;|6.【曲线计算】10分  已知共面且不相交的一直线和一圆弧,求两个对象之间的最小距离。 |;
(defun tt6 (line arc / A1 A2 CEN D P1 P2 PM) ;; by dreamskylxx 2012.1
  (setq line (vlax-ename->vla-object line)
        arc (vlax-ename->vla-object arc))
  (setq p1 (vlax-get line 'startpoint)
        p2 (vlax-get line 'endpoint)
        a1 (vlax-get arc 'startpoint)
        a2 (vlax-get arc 'endpoint)
        cen(vlax-get arc 'Center))
  (if
    (vlax-invoke line 'IntersectWith arc acExtendNone)
    0.
    (progn
      (setq pm (vlax-curve-getclosestpointto line cen T)
             d (apply 'min (mapcar '(lambda(x y)(distance(vlax-curve-getclosestpointto x y) y))
                           (list arc arc line line)
                           (list p1 p2 a1 a2))))
     (if (vlax-curve-getdistatpoint line pm)
       (min d (distance (vlax-curve-getclosestpointto arc pm) pm))
       d
       )
    )
  )
)
  ;; by dreamskylxx 2012.1
(defun tt6 (line arc / A1 A2 CEN D ENT1 P1 P2 PM) 
  (setq ent1 (entget line)
        p1 (cdr(assoc 10 ent1))
        p2 (cdr(assoc 11 ent1))
        a1 (vlax-curve-getstartpoint arc)
        a2 (vlax-curve-getendpoint arc)
        cen(cdr(assoc 10 (entget arc)))
        pm (vlax-curve-getclosestpointto line cen T)
        d  (apply 'min (mapcar '(lambda(x y)(distance(vlax-curve-getclosestpointto x y) y))
                           (list arc arc line line)
                           (list p1 p2 a1 a2))))
 (if (vlax-curve-getdistatpoint line pm)
     (min d (distance (vlax-curve-getclosestpointto arc pm) pm))
      d
 )
)
  ;;测试程序
(defun c:tt6 ()
   (setq line (car(entsel "\n 选直线:"))
         arc  (car(entsel "\n 选圆弧:")))
   (tt6 line arc)
)
第7题组定义,本人以前有个跟组操作相关的函数收集,连接 http://bbs.mjtd.com/thread-86821-1-1.html
 在里面找一个改一下就ok了
 GU_XL版主,第7题答案缺函数GXL-MASSOC,无法测试
 
 第4题相对容易,也没有什么特别的处理方法,略过。 ;;测试:(GPDEl (setq ent (car (entsel "\n选择要删除组的图元:"))))
;; 删除所选物体的所在组定义(支持多重组定义)
(defun gpdel (gpe / el lst a gpdf gplst);;by dreamskylxx 2012.1
  (setq el (entget gpe))
  (if (setq lst (member '(102 . "{ACAD_REACTORS") el))
    (while (and (setq lst (cdr lst)) (= 330 (car (setq a (car lst)))))
      (if (= "GROUP" (cdr (assoc 0 (setq gpdf (entget (cdr a))))))
        (entdel (cdr(assoc -1 gpdf)))
      )
    )
  )
)
第8题,gu版的动作比较大,相当于把所有的都卸载,再重新加载。
 我提个想法,能不能 用vl-unload-vlx先卸载指定fas或vlx,收集family再 load加载,收集family,两次进行对比。。。
 
 
 
 
 |