Đến nội dung


Hình ảnh
- - - - -

Điều chình lisp tính tổng độ dài, ghi ra text dùm minh


  • Please log in to reply
5 replies to this topic

#1 yakumoster

yakumoster

    biết pan

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

Đã gửi 16 October 2014 - 11:12 AM

Chào các bạn, hiện nay mình có 1 lisp sưu tầm từ 1 người bạn, chức năng chính là tính tổng các pline, diện tích và ghi text
Ban đầu mình dùng ok nhưng trên 1 số bản vẽ mình khi mình ghi ra text thì cứ bị gán giá trị 0. 
Không biết là bị lỗi gì nữa (không biết có bị lỗi kích thước text trong lúc chọn không nữa), bạn nào biết giúp với. Sau đây là đoạn code của lisp

;;===========================================
; µÎÁ¡ÀÇ °Å¸®¸¦ °è»êÇÏ¿© ÅؽºÆ®·Î Ç¥±âÇÏ´Â ¸í·É¾î
;--------------------------------------------
(defun c:cond()
(setvar "cmdecho" 0)
(setq d_ts (getvar "textsize") os (getvar "osmode") dlf (getvar "dimlfac"))
(setq ht d_ts)
(prompt "\n Text Height<") (prin1 ht) (prompt ">: ")
(setq ht (getint))
(if (= ht nil) (setq ht d_ts))
(setq scal (getint "\n Input drawing scale (mm->1000 / m->1) -> "))
(if (= scal nil) (setq scal 1))
(prin1)
)

;;===========================================
; Distance PRG
; µÎÁ¡ÀÇ °Å¸®¸¦ °è»êÇÏ¿© ÅؽºÆ®·Î Ç¥±âÇÏ´Â ¸í·É¾î
;--------------------------------------------
(defun c:qds(/ pt1 pt2 di dis ang an)
(setvar "osmode" 32)
(setq pt1 (getpoint "\n Distance first point-> "))
(setq pt2 (getpoint pt1 "\n Distance second point-> "))
(setq di (distance pt1 pt2)
ang (angle pt1 pt2)
an (angtos ang 0 4))
(setvar "osmode" 0)
(setq dis (rtos (/ di scal) 2 2))
(command "text" "j" "r" pt1 ht an dis)
(prompt "\nEnter text point->")
(command "move" "l" "" pt1 pause)
(setvar "osmode" os)
(prin1)
)

;;===========================================
; Distance PRG
; µÎÁ¡ÀÇ °Å¸®(dx)¸¦ °è»êÇÏ¿© ÅؽºÆ®·Î Ç¥±âÇÏ´Â ¸í·É¾î
;--------------------------------------------
(defun c:dx(/ pt1 pt2 di dis dx dxx ang an)
(princ "...DISTANCE PROGRAM...")
(setvar "osmode" 1)
(setq pt1 (getpoint "\n Distance first point-> "))
(setq pt2 (getpoint pt1 "\n Distance second point-> "))
(setq di (distance pt1 pt2)
dX (- (car pt2) (car pt1))
ang (angle pt1 pt2)
an (angtos ang 0 4))
(setvar "osmode" 0)
(setq dis (rtos (/ di scal) 2 2))
(setq dxx (rtos (/ dx scal) 2 2))
(command "text" "j" "c" pt1 ht "0" dxx)
(prompt "\nEnter text point->")
(command "move" "l" "" pt1 pause)
(setvar "osmode" os)
(prin1)
)

;;===========================
; DISTANCE PRG.
; ->¼±ÀÇ ±æÀ̸¦ ±¸ÇÏ°íÀÚ ÇÒ¶§¾²´Â¸í·É
;----------------------------
(defun c:ds(/ pt1 pt2 pt3 di dis)
(princ "...DISTANCE PROGRAM...")
(setvar "osmode" 1)
(setq pt1 (getpoint "\n First point-> "))
(setq pt2 (getpoint pt1 "\n Next point-> "))
(setq di (distance pt1 pt2))
(while (/= pt2 nill)
(setq pt1 pt2)
(setq pt2 (getpoint pt1 "\n Next point-> "))
(if (/= pt2 nil) (setq di (+ di (distance pt1 pt2))))
)
(setq dis (rtos (/ di scal) 2 2))
(setvar "osmode" os)
(command "text" "j" "c" pt1 ht "0" dis)
(prompt "\nEnter text point->")
(command "move" "l" "" pt1 pause)
)

;;¼±ÅÃµÈ LineÀÇ ±æÀÌÀ» ¸ðµÎ ´õÇÏ´Â ¸í·É
(defun c:lp(/ ss en n n1 k tot dis dis1)
(prompt "\n´õÇÏ°íÀÚÇÏ´Â lineÀ» ¼±ÅÃ-> ")
(setq ss (ssget))
(setq n1 (sslength ss))
(setq n n1 k 0)
(setq tot 0 dis 0 dis1 0)
(while (<= 1 n)
(setq en (ssname ss k))
(setq stype (cdr (assoc 0 (entget en))))
(if (= stype "LINE")(progn
(setq spt (cdr (assoc 10 (entget en))))
(setq ept (cdr (assoc 11 (entget en))))
(setq dis1 (distance spt ept))
(setq dis (/ dis1 scal))(prin1 dis)
))(terpri)
(if (= stype "LWPOLYLINE")(progn
(command "area" "e" en)
(setq dis1 (getvar "perimeter"))
(setq dis (/ dis1 scal))
))
(setq tot (+ tot dis))
(setq n (- n 1))
(setq k (+ k 1))
)(terpri)(prompt "ÃÑ")(prin1 n1)(prompt "°³ÀÇ ¶óÀÎ...")
(prompt "Àüü±æÀÌ : ")(prin1 tot)(prompt " m")

(setq tot (rtos tot 2 2))
(setq pt1 (getpoint "\n Enter text point-> "))
(command "text" "j" "c" pt1 ht "0" tot)
(prin1)
)

;;===========================================================
; Number plus
; ->µÎ ¼öÀÇ ÇÕ ±¸Çϱâ
;;-----------------------------------------------------------
(defun c:np(/ ss grpt pt1 n k tot en tv rtv an)
(prompt "\nSelect number->")
(setq ss (ssget))
(setq grpt (grread T))
(setq pt1 (cadr grpt))
(setq n (sslength ss))
(setq k 0 tot 0)
(while (<= 1 n)
(setq en (ssname ss k))
(setq tv (cdr (assoc 1 (entget en))))
(setq rtv (atof tv))
(setq tot (+ tot rtv))
(setq n (- n 1))
(setq k (+ k 1))
)
(setq tot (rtos tot 2 2))
(prompt "\nÇÕ °è : ") (prin1 tot)
(command "text" "j" "c" pt1 ht "0" tot)
(prompt "\nEnter text point->")
(command "move" "l" "" pt1 pause)
(prin1)
)

;;===========================================================
; Quick area
; ->point¸¦ ¼±ÅÃÇÏ¿© È­¸é¿¡ ¸éÀûÀ» ÀÚµ¿À¸·Î Ç¥±â
;;-----------------------------------------------------------
(defun c:qa(/ pt1 ar1 ar2)
(setvar "osmode" 0)
(setq pt1 (getpoint "\nPick a point ->"))
(command "bpoly" pt1 "" )
(command "area" "o" "l")
(setq ar1 (/ (getvar "area") (* scal scal)))
(setq ar2 (rtos ar1 2 2))
(command "erase" "l" "")
(command "text" "j" "c" pt1 ht "0" ar2)
(prompt "\nEnter text point->")
(command "move" "l" "" pt1 pause)
(setvar "osmode" os)
(prin1)
)
  • 0

#2 Namvanvo

Namvanvo

    Edu level: li5

  • Members
  • PipPipPipPipPip
  • 386 Bài viết
Điểm đánh giá: 42 (tàm tạm)

Đã gửi 16 October 2014 - 11:25 AM

Bạn thử tìm tất cả dòng nào có (command "text" "j" "c" pt1 ht.......

và xóa chữ ht ra khỏi lisp


  • 0

#3 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 16 October 2014 - 12:54 PM

- bản vẽ đó chắc style khác 0, nếu xóa ht thì phải thay = d_ts Nam nhỉ ^^, qua bản khác đôi khi lại ko đc như mong mún, nếu siêng có thể dùng entmake thay thằng command đi đâu xài cũng đc ^^
  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#4 yakumoster

yakumoster

    biết pan

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

Đã gửi 16 October 2014 - 03:09 PM

Ok, cám ơn bác Nam ^^, mình làm được rồi
  • 0

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 16 October 2014 - 11:53 PM

- bản vẽ đó chắc style khác 0, nếu xóa ht thì phải thay = d_ts Nam nhỉ ^^, qua bản khác đôi khi lại ko đc như mong mún, nếu siêng có thể dùng entmake thay thằng command đi đâu xài cũng đc ^^

 

Hề hề hề,

Không phải là lỗi do "chắc style khác 0" đâu.

Theo thiển ý của mình, lỗi là khi trên bản vẽ,textsize hiện hành là 0 tức là biến d_ts =0, và người dùng không nhập giá trị ht khi lisp yêu cầu (setq ht (getint)).

Nên chăng bổ sung thêm dòng nhắc yêu cầu người dùng phải nhập chiều cao text khi textsize hiện hành là 0

Việc sử dụng hàm enmake mà vẫn dùng biến ht như ở đây thì lỗi vẫn có thể xảy ra đấy Nhóc ạ


  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#6 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 17 October 2014 - 07:34 AM

- hi nhoc lại ko xem kỹ rui ^^, hình như nhoc có thấy dòng nhắc:

(prompt "\n Text Height<") (prin1 ht) (prompt ">: ")

- nguoi dung se thay highttext hien thoi la bao nhiu để biết có cần nhập hight ko


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^