Đến nội dung


Hình ảnh
- - - - -

Đoạn CODE củ chuối ??? Sửa mãi vẫn dở hơi, Đành nhờ mấy bác Pro dùng tuyệt chiêu ???


  • Please log in to reply
3 replies to this topic

#1 leejang

leejang

    biết lệnh move

  • Members
  • PipPipPip
  • 120 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 23 June 2009 - 08:49 AM

Cái Lisp tính diện tích của em, ở những bản vẽ bình thường thì chạy ngon lành nhưng gặp những bản vẽ " củ chuối" là sau vài lần chạy là nó tự mất cái bắt điểm OSNAP(Tắt F3). Em rất khó chịu, bác pro nào chỉnh giúp em với !!!
CODE
;;=============== Dien tich ==============
(defun c:R(/ dtl dtcon pt1 pt2 ss et oslast vsize)
(command "dimzin" "0")
(Setq CVAR (Getvar "CMDECHO"))
(Setvar "CMDECHO" 0)
(print)
(if (= tle nil) (progn
(setq tle (getreal "Ty le ban ve 1:X , X=?: "))
(setq ntl (/ 1 tle))
; (setq ntl 1)
(setq tl2 (* ntl ntl))
)
)
(setq dtl 0)
(setq ss (ssadd))
(setq oslast (getvar "OSMODE"))
(command "osnap" "")
(print)
(print)
(setq pt1 (getpoint "\n Chon diem ben trong hinh : "))
(while (/= pt1 nil)
(command "-boundary" pt1 "")
(setq et (entlast))
(ssadd et ss)
(command "area" "e" "last")
; (setq vsize (/ (getvar "VIEWSIZE") tl1))
; (command "hatch" "ANSI31" vsize "0" "last" "")
(setq et (entlast))
(ssadd et ss)
(setq dtcon (/ (getvar "AREA") tl2))
(setq dtl (+ dtcon dtl))
(prompt (strcat "\n Dien tich hinh vua chon=" (rtos dtcon 2 3)))
(print)
(print)
(setq pt1 (getpoint "\nPick internal point : "))
)
(command "setvar" "OSMODE" oslast)
(command "erase" ss "")
(setq ss nil)
(command "redraw")
; (setq dtl (/ dtl 2))
; (print)
(prompt (strcat "\n Dien tich = " (rtos dtl 2 4)))
(print)

; (setq pt2 (getpoint "\n Chon text ghi chu dien tich: "))
; (if (/= 0 (DXF 40 (tblsearch "STYLE" (getvar "TEXTSTYLE"))))
; (command "text" pt2 "0" (strcat (rtos dtl 2 2) " m2"))
; (command "text" pt2 "2" "0" (strcat (rtos dtl 2 3) "m2" ))
; );if

;; ====== nua dien tich=======
(setq xxx (/ dtl 2))
(print)
(prompt (strcat "\n 1/2 Dien tich = " (rtos xxx 2 4)))
(print)

;;ghi chu dien tich ================
(setq giatri (entget (car (entsel "\n Chon Text dien dien tich: "))))
(setq gia (assoc 1 giatri))
(setq nt1 (cons 1 (rtos dtl )))
(setq giatri (subst nt1 gia giatri))
(entmod giatri)
(princ)
(Command "")
(Setvar "CMDECHO" CVAR)
);defun ARR
(princ)

; Hide & Show
(DEFUN C:LT () (COMMAND "LTSCALE"))
(defun c:an (/ SSet Count Elem)

(defun Dxf (Id Obj)
(cdr (assoc Id (entget Obj)))
);end Dxf

(prompt "\nChon doi tuong an di: ")
(cond
((setq SSet (ssget))
(repeat (setq Count (sslength SSet))
(setq Count (1- COunt)
Elem (ssname SSet Count))
(if (/= 4 (logand 4 (Dxf 70 (tblobjname "layer" (Dxf 8 Elem)))))
(if (Dxf 60 Elem)
(entmod (subst '(60 . 1) (assoc 60 (entget Elem)) (entget Elem)))
(entmod (append (entget Elem) (list '(60 . 1))))
)
(prompt "\nKhong the an,doi tuong da bi khoa !. ")
);end if
);end repeat
)
);end cond
(princ)
);end c:InVis
  • 0

#2 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 23 June 2009 - 09:49 AM

Cái Lisp tính diện tích của em, ở những bản vẽ bình thường thì chạy ngon lành nhưng gặp những bản vẽ " củ chuối" là sau vài lần chạy là nó tự mất cái bắt điểm OSNAP(Tắt F3). Em rất khó chịu, bác pro nào chỉnh giúp em với !!!


Chẳng phải tại bản vẽ củ chuối đâu mà do khi bạn chọn điểm bên trong mà cái boundary
nằm ngoài vùng nhìn sẽ phát sinh lỗi, khi đó nếu bạn nhấn esc sẽ thoát ra khỏi chương trình và mất osnap.
Cái này trước đây cũng có người hỏi rồi.
Mình sửa lisp như sau đây, bạn test thử xem sao, cứ esc thoải mái.
Mình cũng ko chắc sau khi sửa lisp có giải quyết đc vấn đề hay ko.


(defun c:R (/ dtl dtcon pt1 pt2 ss et vsize)
(setq temp *error* *error* myerror)
(defun myerror(msg)
(setvar "OSMODE" oslast)
(setq *error* temp)
)
(command "dimzin" "0")
(Setq CVAR (Getvar "CMDECHO"))
(Setvar "CMDECHO" 0)
(print)
(if (= tle nil)
(progn
(setq tle (getreal "Ty le ban ve 1:X , X=?: "))
(setq ntl (/ 1 tle))
(setq tl2 (* ntl ntl))
)
)
(setq dtl 0)
(setq ss (ssadd))
(setq oslast (getvar "OSMODE"))
(command "osnap" "")
(print)
(print)
(setq pt1 (getpoint "\n Chon diem ben trong hinh : "))
(while (/= pt1 nil)
(command "-boundary" pt1 "")
(setq et (entlast))
(ssadd et ss)
(command "area" "e" "last")
(setq et (entlast))
(ssadd et ss)
(setq dtcon (/ (getvar "AREA") tl2))
(setq dtl (+ dtcon dtl))
(prompt
(strcat "\n Dien tich hinh vua chon=" (rtos dtcon 2 3))
)
(print)
(print)
(setq pt1 (getpoint "\nPick internal point : "))
)
(command "setvar" "OSMODE" oslast)
(command "erase" ss "")
(setq ss nil)
(command "redraw")
(prompt (strcat "\n Dien tich = " (rtos dtl 2 4)))
(print)

;; ====== nua dien tich=======
(setq xxx (/ dtl 2))
(print)
(prompt (strcat "\n 1/2 Dien tich = " (rtos xxx 2 4)))
(print)

;;ghi chu dien tich ================
(setq giatri (entget (car (entsel "\n Chon Text dien dien tich: "))))
(setq gia (assoc 1 giatri))
(setq nt1 (cons 1 (rtos dtl)))
(setq giatri (subst nt1 gia giatri))
(entmod giatri)
(princ)
(Command "")
(Setvar "CMDECHO" CVAR)
(setq *error* temp)
)
(princ)

; Hide & Show
(DEFUN C:LT () (COMMAND "LTSCALE"))

(defun c:an (/ SSet Count Elem)
(defun Dxf (Id Obj)
(cdr (assoc Id (entget Obj)))
) ;end Dxf
(prompt "\nChon doi tuong an di: ")
(cond
((setq SSet (ssget))
(repeat (setq Count (sslength SSet))
(setq Count (1- COunt)
Elem (ssname SSet Count)
)
(if (/= 4 (logand 4 (Dxf 70 (tblobjname "layer" (Dxf 8 Elem)))))
(if (Dxf 60 Elem)
(entmod
(subst '(60 . 1) (assoc 60 (entget Elem)) (entget Elem))
)
(entmod (append (entget Elem) (list '(60 . 1))))
)
(prompt "\nKhong the an,doi tuong da bi khoa !. ")
) ;end if
) ;end repeat
)
) ;end cond
(princ)
) ;end c:InVis

  • 0

#3 leejang

leejang

    biết lệnh move

  • Members
  • PipPipPip
  • 120 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 23 June 2009 - 10:35 AM

Chẳng phải tại bản vẽ củ chuối đâu mà do khi bạn chọn điểm bên trong mà cái boundary
nằm ngoài vùng nhìn sẽ phát sinh lỗi, khi đó nếu bạn nhấn esc sẽ thoát ra khỏi chương trình và mất osnap.
Cái này trước đây cũng có người hỏi rồi.
Mình sửa lisp như sau đây, bạn test thử xem sao, cứ esc thoải mái.
Mình cũng ko chắc sau khi sửa lisp có giải quyết đc vấn đề hay ko.


(defun c:R (/ dtl dtcon pt1 pt2 ss et vsize)
(setq temp *error* *error* myerror)
(defun myerror(msg)
(setvar "OSMODE" oslast)
(setq *error* temp)
)
(command "dimzin" "0")
(Setq CVAR (Getvar "CMDECHO"))
(Setvar "CMDECHO" 0)
(print)
(if (= tle nil)
(progn
(setq tle (getreal "Ty le ban ve 1:X , X=?: "))
(setq ntl (/ 1 tle))
(setq tl2 (* ntl ntl))
)
)
(setq dtl 0)
(setq ss (ssadd))
(setq oslast (getvar "OSMODE"))
(command "osnap" "")
(print)
(print)
(setq pt1 (getpoint "\n Chon diem ben trong hinh : "))
(while (/= pt1 nil)
(command "-boundary" pt1 "")
(setq et (entlast))
(ssadd et ss)
(command "area" "e" "last")
(setq et (entlast))
(ssadd et ss)
(setq dtcon (/ (getvar "AREA") tl2))
(setq dtl (+ dtcon dtl))
(prompt
(strcat "\n Dien tich hinh vua chon=" (rtos dtcon 2 3))
)
(print)
(print)
(setq pt1 (getpoint "\nPick internal point : "))
)
(command "setvar" "OSMODE" oslast)
(command "erase" ss "")
(setq ss nil)
(command "redraw")
(prompt (strcat "\n Dien tich = " (rtos dtl 2 4)))
(print)

;; ====== nua dien tich=======
(setq xxx (/ dtl 2))
(print)
(prompt (strcat "\n 1/2 Dien tich = " (rtos xxx 2 4)))
(print)

;;ghi chu dien tich ================
(setq giatri (entget (car (entsel "\n Chon Text dien dien tich: "))))
(setq gia (assoc 1 giatri))
(setq nt1 (cons 1 (rtos dtl)))
(setq giatri (subst nt1 gia giatri))
(entmod giatri)
(princ)
(Command "")
(Setvar "CMDECHO" CVAR)
(setq *error* temp)
)
(princ)

; Hide & Show
(DEFUN C:LT () (COMMAND "LTSCALE"))

(defun c:an (/ SSet Count Elem)
(defun Dxf (Id Obj)
(cdr (assoc Id (entget Obj)))
) ;end Dxf
(prompt "\nChon doi tuong an di: ")
(cond
((setq SSet (ssget))
(repeat (setq Count (sslength SSet))
(setq Count (1- COunt)
Elem (ssname SSet Count)
)
(if (/= 4 (logand 4 (Dxf 70 (tblobjname "layer" (Dxf 8 Elem)))))
(if (Dxf 60 Elem)
(entmod
(subst '(60 . 1) (assoc 60 (entget Elem)) (entget Elem))
)
(entmod (append (entget Elem) (list '(60 . 1))))
)
(prompt "\nKhong the an,doi tuong da bi khoa !. ")
) ;end if
) ;end repeat
)
) ;end cond
(princ)
) ;end c:InVis

kaka, được rùi, cảm ơn bác nhìu nhé !!!
  • 0

#4 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 June 2009 - 02:35 PM

Liệu q288 có thể sửa đoạn lisp này lại để khi ta pick vào 1 vùng tính diện tích thì lisp sẽ tạo ra một đối tượng boundary khác màu (màu đỏ chẳng hạn) bao quanh vùng tính tiện tích đó. sau khi lisp kết thúc lệnh hay esc kết thúc giữa chừng thì những đối tượng boundary đó sẽ đc xóa đi.
Mục đích của việc này là nhằm đánh dấu những miền ta đã tính diện tích để tránh nhầm lẫn 1 vùng tính diên tích ta pick 2 lần dẫn đến kết quả sai.

Và nếu có thể thì ở bước xuất kết quả. nếu không gán vào 1 text có trước thì ta có thêm lựa chọn là pick vào 1 điểm bất kỳ để vẽ kết quả theo text style hiện thời.

Mình nghĩ lisp như vậy sẽ là 1 lisp tính diện tích hoàn chỉnh
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD