本帖最后由 highflybird 于 2011-4-18 11:25 编辑
如果真是那样的话,那只有分点,把边界线分成n个点,对每个点映射,(polar函数)然后由映射后的点表构成多段线。
以下代码仅供参考。
 -
- (defun c:test(/ DIS ENT I LST OBJ PNT PTS SEL X)
- (setq sel (ssget))
- (setq i 0)
- (setq pnt (getpoint "\n请输入形心:"))
- (setq pnt (trans pnt 1 0))
- (setq dis (getdist "\n请输入偏移距离:"))
- (repeat (sslength sel)
- (setq ent (ssname sel i))
- (setq obj (vlax-ename->vla-object ent))
- (setq lst (get-spline-vertexs ent 100))
- (setq pts (mapcar '(lambda (x) (polar pnt (angle pnt x) (- (distance pnt x) dis))) lst))
- (Make-Poly pts)
- (setq i (1+ i))
- )
- )
- ;;;取得曲线的点
- (defun get-spline-vertexs (ent n / DIST ENDPAR I LEN OBJ PT PTS SEG)
- (setq obj (vlax-ename->vla-object ent))
- (setq endpar (vlax-curve-getEndParam obj))
- (setq len (vlax-curve-getDistAtParam obj endpar))
- (setq seg (/ len n))
- (setq dist 0)
- (while (< dist len)
- (setq pt (vlax-curve-getPointAtDist obj dist))
- (setq pts (cons pt pts))
- (setq dist (+ seg dist))
- )
- (if (not (vlax-curve-isClosed obj))
- (setq pt (vlax-curve-getEndPoint obj)
- pts (cons pt pts)
- )
- )
- (reverse pts)
- )
- ;;;绘制多段线
- (defun Make-Poly (pp / x)
- (entmakeX ;画凸包
- (append
- '((0 . "LWPOLYLINE")
- (100 . "AcDbEntity")
- (100 . "AcDbPolyline")
- )
- (list (cons 90 (length pp))) ;顶点个数
- (mapcar
- (function (lambda (x) (cons 10 x)))
- pp
- ) ;多段线顶点
- (list (cons 70 1)) ;闭合的
- (list (cons 62 1)) ;红色的
- )
- )
- )
|