meja 发表于 2013-7-3 16:48:55

求帮助修改一个框选剪切程序

有时候线段两边不齐,一般都是做辅助线剪切点,我的想法是直接画矩形修剪掉,好不容易“拼”好了程序,从左往右剪切没有问题,但从右往左不行,容易留下一个尾巴,求完善!谢谢高手;========== angle stuff ==============
;Convert angle in degrees to radians
(defun dtr (a) (* pi (/ a 180.0)))

; Convert value in radians to degrees
(defun RTD (r)   (* 180.0 (/ r pi)))
;============================
;MAIN ROUTINE
;============================
(defun C:CLIP ( / sblip scmde
      @pt1 @pt2 @pt3 @pt4 xpt1 xpt2 fp1 fp2 fp3 fp4
      en ans anshelp ang sblip scmde en en1
      ansclip screen ang os cclip inspoint grpcnt)
;setup
(setq sblip (getvar "blipmode"))
(setq scmde (getvar "cmdecho"))
(setvar "blipmode" 0)(princ)
(setvar "cmdecho" 0)(princ)
(command "_.osnap" "off")
      (if (= grpcnt nil)(setq grpcnt 0) )
;get points
(prompt "Enter ")
(setq @pt1 (getpoint "1st Point :"))

(setq @pt2 (getcorner @pt1 "\n2nd Point :"))
;Break List of points in x y parts
(setq xpt1 (car @pt1) ypt1 (cadr @pt1))
(setq xpt2 (car @pt2) ypt2 (cadr @pt2))
;Set Trim/Fence Points inside Pline Boundary
       (if (= xpt1 xpt2)(quit))
;=============================================================
;;Set PTS if lower left picked first
       (cond ((and (< xpt1 xpt2)(< ypt1 ypt2))
         (progn
    (setq fp1 (list (+ xpt1 0.03125)(+ ypt1 0.03125)))
    (setq fp2 (list (- xpt2 0.03125)(+ ypt1 0.03125)))
    (setq fp3 (list (- xpt2 0.03125)(- ypt2 0.03125)))
    (setq fp4 (list (+ xpt1 0.03125)(- ypt2 0.03125)))
;;;;;Set Points to draw PLINE or RECTANGLE Boundary
    (setq @pt2 (list xpt2 ypt1))
    (setq @pt3 (list xpt2 ypt2))
    (setq @pt4 (list xpt1 ypt2))
;;;;;Set OFFSET ANGLE
(setq ang (dtr (angle @pt1 @pt3) ) )
   );end progn
       ));end cond1
;=============================================================
;;Set PTS if Upper left picked first
       (cond ((and (< xpt1 xpt2)(> ypt1 ypt2))
   (progn
    (setq fp1 (list (+ xpt1 0.03125)(- ypt1 0.03125)))
    (setq fp2 (list (+ xpt1 0.03125)(+ ypt2 0.03125)))
    (setq fp3 (list (- xpt2 0.03125)(+ ypt2 0.03125)))
    (setq fp4 (list (- xpt2 0.03125)(- ypt1 0.03125)))
;;;;;Set Points to draw PLINE or RECTANGLE Boundary
    (setq @pt2 (list xpt2 ypt1))
    (setq @pt3 (list xpt2 ypt2))
    (setq @pt4 (list xpt1 ypt2))
;;;;;Set OFFSET ANGLE
    (setq ang (dtr (* -1 (angle @pt1 @pt3) ) ) )
   );end progn
       ));end cond2
;=============================================================
;;Set PTS if Lower Right picked first
       (cond ((and (> xpt1 xpt2)(< ypt1 ypt2))
   (progn
    (setq fp1 (list (- xpt1 0.03125)(+ ypt1 0.03125)))
    (setq fp2 (list (- xpt1 0.03125)(- ypt2 0.03125)))
    (setq fp3 (list (+ xpt2 0.03125)(- ypt2 0.03125)))
    (setq fp4 (list (+ xpt2 0.03125)(+ ypt1 0.03125)))
;;;;;Set Points to draw PLINE or RECTANGLE Boundary
    (setq @pt2 (list xpt2 ypt1))
    (setq @pt3 (list xpt2 ypt2))
    (setq @pt4 (list xpt1 ypt2))
;;;;;Set OFFSET ANGLE
(setq ang (dtr (angle @pt1 @pt3) ) )
   );end progn
       ));end cond3
;=============================================================
;;Set PTS if Upper Right picked first
       (cond ((and (> xpt1 xpt2)(> ypt1 ypt2))
   (progn
    (setq fp1 (list (- xpt1 0.03125)(- ypt1 0.03125)))
    (setq fp2 (list (- xpt2 0.03125)(- ypt1 0.03125)))
    (setq fp3 (list (- xpt2 0.03125)(+ ypt2 0.03125)))
    (setq fp4 (list (- xpt1 0.03125)(+ ypt2 0.03125)))
;;;;;Set Points to draw PLINE or RECTANGLE Boundary
    (setq @pt2 (list xpt2 ypt1))
    (setq @pt3 (list xpt2 ypt2))
    (setq @pt4 (list xpt1 ypt2))
;;;;;Set OFFSET ANGLE
(setq ang (dtr (angle @pt1 @pt3) ) )
   );end progn
       ));end cond4
;=============================================================
;Draw Trim to Boundary
(command "_.rectang" @pt1 @pt3)
;Get PLINE/REC OUTSIDE Boundary to delete later
(setq en (entlast))
(command "offset" 1 en (polar '(0.0 0.0) ANG 0.001)"")
;Get PLINE/REC INSIDE Boundary to delete later
(setq en1 (entlast))
;Use TRIM with FENCE to BREAK geometry - repeat 4 times
   (repeat 4
(command "_.trim" "" "F" fp3 fp4 ""
         "F" fp2 fp3 ""
         "F" fp1 fp2 ""
         "F" fp1 fp4 "" "")
   );end repeat
(command "_.erase" en1 "")
(command "_.erase" en "")
;==============================================================

;==============================================================
;Set UCS to WORLD
(command "_.ucs" "W")
(setvar "blipmode" sblip)(princ)
(setvar "cmdecho" scmde)(princ)
(terpri)
(terpri)
(terpri)
(PRINC "\nCLIP")(princ)
页: [1]
查看完整版本: 求帮助修改一个框选剪切程序