Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#901 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 16 March 2010 - 08:47 PM

Dạ, đường ống dài đi qua các nút 18,21,25,31,30 em đã cắt từ khi sử dụng lisp tính chiều dài của bác Bình. Vừa rồi em cũng sửa lại nhưng em vẫn chưa chạy được lisp. Nhờ anh Thiệp check giùm:

"Command: svba

Select objects: Specify opposite corner: 644 found

Select objects:

Chon do cao text : 20
bad argument type: lselsetp nil"

Check thử cho svba đây :
http://www.cadviet.c...les/2/a_4_1.dwg
Khi sử dụng Lisp của bác Thiep thì các đường nối 2 điểm nút phải cắt qua Text Nút, nếu không cắt thì không thử được.
Hơn nữa -> để Lisp chạy đúng chiều mũi tên (từ điểm nút này đến điểm nút kia) thì nút đầu phải trùng với Startpoint; nút cuối phải trùng với Endpoint.

Lisp sau sẽ giúp svba KTRA những đường PLINE nối điểm nút, Nếu PLINE nối điểm đầu và điểm cuối có 2 TEXT thuộc LAYER sttkhu thì đúng, ngược lại đó là những PLINE chưa đúng, đồng thời LISP sẽ đánh point điểm đầu của PLINE màu xanh, PLINE điểm cuối màu đỏ để svba dễ dàng kiểm tra.
svba thử nhé :
 
(defun c:ktra(/ laytn laysttnut oldpo oldla oldos ss i lstLWP sst)
(command "undo" be)
(setq laytn "thoatnuoc")
(setq laysttnut "sttnut")
(setq oldpo (getvar "pdmode"))
(setq oldla (getvar "clayer"))
(setq oldos (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "pdmode" 3)
(setvar "pdsize" 5)
(setvar "osmode" 0)
(command "Layer" "N" "KTRA" "S" "KTRA" "")
(setq ss (ssget (list (cons 0 "*POLYLINE") (cons 8 laytn))) i 0)
(while (< i (sslength ss))
(setq lstLWP (ACET-GEOM-VERTEX-LIST (ssname ss i)))
(setq sst (ssget "f" lstLWP (list (cons 0 "TEXT") (cons 8 laysttnut))))
(if (or (= sst nil)
(= (sslength sst) 1)
(> (sslength sst) 2)
)
(vlax-put (vlax-ename->vla-object (ssname ss i)) 'color 2)
)
(command "point" (car lstLWP))
(vlax-put (vlax-ename->vla-object (entlast)) 'color 3)
(command "point" (last lstLWP))
(vlax-put (vlax-ename->vla-object (entlast)) 'color 1)
(setq i (1+ i))
);while
(setvar "pdsize" (/ (cdr(assoc 40 (entget (ssname sst 0)))) 2))
(setvar "clayer" oldla)
(setvar "osmode" oldos)
(command "undo" end)
);defun

PS : Nếu em đã lỡ đánh số thứ tự điểm nút không cùng chiều với mũi tên thì có thể sử dụng Lisp đổi chiều PLINE của bác Hoành đã viết trên diễn đàn mình.
Chúc thành công :D
  • 2

#902 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 17 March 2010 - 08:25 AM

Dạ, đường ống dài đi qua các nút 18,21,25,31,30 em đã cắt từ khi sử dụng lisp tính chiều dài của bác Bình. Vừa rồi em cũng sửa lại nhưng em vẫn chưa chạy được lisp. Nhờ anh Thiệp check giùm:

"Command: svba

Select objects: Specify opposite corner: 644 found

Select objects:



Chon do cao text : 20
bad argument type: lselsetp nil"

Chào svba, A Thiep thấy có sự khác nhau về câu hỏi: lisp của anh hỏi: "Chon do cao text <20> :"
Còn lisp svba chạy thì hỏi: "Chon do cao text : " là sao vậy sao kà!
Thôi thì svba tạm thử lại lisp svb.lsp này xem. Nên nhớ cài Express tool nhé
;| Lisp thong ke duong ong nuoc
copyright by thiep 03/2010|;
;;;-------------------------------------------
(defun SS-entlst (ss / c L)
(setq c -1)
(repeat (sslength ss)
(setq L (cons (ssname ss (setq c (1+ c)))
L
)
)
)
(reverse L)
)
;;;----------------------------------
(defun filter (lstent otype olayer / kq)
(foreach pp lstent
(setq tt (entget pp))
(if (and
(member (cons 0 otype) tt)
(member (cons 8 olayer) tt)
)
(setq kq (append kq (list pp)))
)
)
kq
)
;;;======================
(defun timgan (p lst / dmin ppluu)
(foreach pp lst
(setq d (distance p pp))
(if (or (not dmin) (> dmin d))
(setq dmin d
ppluu pp
)
)
)
ppluu
)
;;;======================
(defun dxf (code ent)
(cdr (assoc code (entget ent)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;
(defun SAVE_MODE ()
(setq OLD_OSMODE (getvar "OSMODE")
OLD_ORTHOMODE (getvar "ORTHOMODE")
)
(setvar "cmdecho" 0)
(setvar "OSMODE" 0)
)
(defun RESTORE ()
(setvar "osmode" OLD_OSMODE)
(setvar "ORTHOMODE" OLD_ORTHOMODE)
)
;|===========================================================
MAIN LISP
===========================================================|;
(defun c:svb (/ lstent lstLWP_tn lstLWP_vh lsttextt tsi
Tstyle lstpoCP lstenttext lstLWP_vh_text
TblObj p1 rows nRow nCol
objLwp lstpoF len midpo param
ang mfen1 mfen2 ss lstLWP2
lsttext_ong po str val
lstval lstvalpo doan pogan tenkhu
strso lstpo p2 en
)
(or ActDoc
(setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(or *Model* (setq *Model* (vla-get-ModelSpace ActDoc)))
(vla-StartUndoMark ActDoc)
(SAVE_MODE)
(setq lstent (SS-entlst (ssget '((0 . "LWPOLYLINE,TEXT")
(8 . "vh,thoatnuoc,sttnut,sttkhu")
)
)
)
lstLWP_tn (filter lstent "LWPOLYLINE" "thoatnuoc")
lstLWP_vh (filter lstent "LWPOLYLINE" "vh")
lsttextt (filter lstent "TEXT" "sttnut")
)
(setq p1 (append (acet-list-remove-nth 2 (getvar "extmin")) (list 0.0))
rows (length lstLWP_tn)
)
(setq tsi (acet-dxf 40 (entget (nth 0 lsttextt)))
Tstyle (acet-dxf 7 (entget (nth 0 lsttextt)))
)
(setq oldtsi tsi)
(setq tsi (getreal
(strcat "\nChon do cao text <" (rtos oldtsi 2 0) "> : ")
)
)
(or tsi (setq tsi oldtsi))
;;;------------------
(foreach entLWP2 lstLWP_vh
;;; (redraw entLWP2 3)
(setq lstpoCP (ACET-GEOM-VERTEX-LIST entLWP2))
(if (or (vlax-curve-isClosed entLWP2)
(eq (car lstpoCP) (last lstpoCP))
)
(progn
(setq ss3 (ssget "CP"
lstpoCP
'((0 . "TEXT") (8 . "sttkhu"))
)
)
(if ss3
(progn
(setq lstenttext (SS-entlst ss3))
(setq lstLWP_vh_text
(cons (cons entLWP2 lstenttext) lstLWP_vh_text)
)
)
)
)
)
;;; (redraw entLWP2 4)
)
;;;---------------

(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.0)
(progn
(setq TblObj (vla-addtable
*Model*
(vlax-3d-point p1)
(1+ rows)
;;the number of rows
3
;;the number of columns
tsi
;;the height of the rows
(* 6 tsi)
;;the width of the columns
)
)
(vla-UnMergeCells TblObj 0 0 0 2)
(vla-MergeCells TblObj 0 0 1 2)
(vla-put-vertcellmargin TblObj (* 0.5 tsi))
(mapcar '(lambda (x) (vla-setTextHeight TblObj x tsi))
(list acTitleRow acHeaderRow acDataRow)
)
(mapcar
'(lambda (x) (vla-setAlignment TblObj x acMiddleCenter))
(list acTitleRow acHeaderRow acDataRow)
)
(mapcar
'(lambda (x) (vla-SetTextStyle TblObj x Tstyle))
(list acTitleRow acHeaderRow acDataRow)
)
(vla-setText TblObj 0 0 "§O¹N èNG")
(vla-setText TblObj 0 1 "TIÓU KHU")
(vla-SetColumnWidth TblObj 0 (* 8.4 tsi))
(setq nRow 1)

;;; ===================;tung duong ong
(foreach entLWP lstLWP_tn
(setq objLwp (vlax-ename->vla-object entLWP)
lstpoF (ACET-GEOM-VERTEX-LIST entLWP)
len (vla-get-Length objLwp)
midpo (vlax-curve-getPointAtDist objLwp (/ len 2))
param (vlax-curve-getParamAtPoint objLwp midpo)
ang (angle '(0 0 0) (vlax-curve-getFirstDeriv objLwp param))
mfen1 (polar midpo (+ ang (/ pi 2)) 75)
mfen2 (polar midpo (- ang (/ pi 2)) 75)
ss (ssget "F" lstpoF '((0 . "TEXT") (8 . "sttnut")))
lstLWP2 (SS-entlst (ssget "F"
(list mfen1 mfen2)
'((0 . "LWPOLYLINE") (8 . "vh"))
)
)
)
(if ss
(progn
(setq lsttext_ong (SS-entlst ss))
;;; ==============;tung text chu dau ong sttnut
(foreach ent lsttext_ong
(redraw ent 3)
(setq po (dxf 10 ent)
str (dxf 1 ent)
val (read str)
lstval (append (list str) lstval)
)
(redraw ent 4)
)
(setq doan (strcat (nth 1 lstval) "-" (nth 0 lstval)))
(and doan (vla-setText TblObj nRow 0 doan))
(setq nCol 1)
)
)
;;; =========================;tung duong bao / 2
(foreach entLWP2 lstLWP2
(setq lstenttext
(acet-dxf entLWP2 lstLWP_vh_text)
lstpo nil
lstvalpo nil
)
;;; ====================;tung text trong duong bao
(foreach ent lstenttext
(setq po (dxf 10 ent))
(if (distof (dxf 1 ent))
(setq strso (dxf 1 ent))
(progn
(setq str (dxf 1 ent)
lstpo (cons po lstpo)
lstvalpo (cons (cons po str) lstvalpo)
)
)
)
)
(if lstvalpo
(progn
(setq pogan (timgan midpo lstpo)
tenkhu (strcat strso (acet-dxf pogan lstvalpo))
)
(and tenkhu (vla-setText TblObj nRow nCol tenkhu))
(setq nCol (1+ nCol))
)
)
)
(setq nRow (1+ nRow))
)
) ;END progn
) ;END IF
(vla-Update TblObj)
(setq en (entlast)
ss (acet-list-to-ss (list en))
)
(setq
p2 (acet-ss-drag-move ss p1 "\n<<< Place Table >>> ")
)
(vla-put-InsertionPoint TblObj (vlax-3d-point p2))
(vla-Update TblObj)
(vlax-release-object TblObj)
(RESTORE)
(vla-StartUndoMark ActDoc)
(princ "\nThank you for use my lisp: svb.lsp!")
(princ)
)

  • 1

#903 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 17 March 2010 - 08:33 AM

Chào svba, A Thiep thấy có sự khác nhau về câu hỏi: lisp của anh hỏi: "Chon do cao text <20> :"
Còn lisp svba chạy thì hỏi: "Chon do cao text : " là sao vậy sao kà!

Là vầy : svba nhấn nút Download lisp file :
-> Dòng của bác Thiep đẹp như vầy : (strcat "\nChon do cao text <" (rtos oldtsi 2 0) "> : ")

---> Lại trở thành như vầy đó : (strcat "\nChon do cao text : ")

Buồn như zầy đó :D

@svba : Hãy nhấn nút Reply bài viết của bác Thiep -> chép hết code về sử dụng, em nhé.
  • 1

#904 svba1608

svba1608

    Tưởng Thị Tú Khuyên

  • Moderator
  • PipPipPipPipPipPipPip
  • 601 Bài viết
Điểm đánh giá: 620 (tốt)

Đã gửi 17 March 2010 - 08:50 AM

Cảm ơn anh Thiệp và anh Tue_NV! Nhờ sự giúp đỡ của các anh, em đã hoàn thành được rồi.
Nay em lại có một việc khác muốn nhờ.

Hình đã gửi

Như trên hình minh hoạ, em cần đánh dấu chiều chảy vào các ống của các lưu vực.
Ví dụ như ô số 23 và 32, cần vẽ các mũi tên hướng từ tâm ra phía đường ống cho toàn bộ các ô trong bản vẽ (để thể hiện chiều chảy của nước).
Nhờ các anh giúp đỡ! Em xin chân thành cảm ơn!
File minh hoạ
http://www.cadviet.c...files/2/d_1.dwg
  • 0
http://khuyen.space

#905 Vu Dinh Tu

Vu Dinh Tu

    biết pan

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

Đã gửi 17 March 2010 - 02:11 PM

Các bác cho em hỏi làm thế nào để lấy được tất cả các tên của layer trong một bản vẽ.
Em muốn dùng lisp để đặt net in theo layer cho tiện.

Thanks các bác,
  • 0

#906 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 17 March 2010 - 03:39 PM

Các bác cho em hỏi làm thế nào để lấy được tất cả các tên của layer trong một bản vẽ.
Em muốn dùng lisp để đặt net in theo layer cho tiện.

Thanks các bác,

Chào bạn Vu Dinh Tu,
Lần sau bạn nên chịu khó tìm kiếm trên diễn đàn trước khi post yêu cầu của bạn, bạn nhé.
Đây là cái lisp đã được post lên khá lâu, mình quên mất tên tác giả, hình như của bác SSG hay Nguyenhoanh chi đó, bạn tham khảo nhé.
http://www.cadviet.c.../lapdslayer.lsp

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

#907 kieumanh

kieumanh

    biết vẽ rectang

  • Members
  • PipPip
  • 86 Bài viết
Điểm đánh giá: 140 (tàm tạm)

Đã gửi 17 March 2010 - 05:04 PM

Các bác ơi! Tôi dùng lệnh leader để vẽ mũi tên (dim leader) mà không muốn có text kèm theo nên thao tác thường là:
- Le, pick 3 điểm trên màn hình, Enter, Enter, n, Enter.
Tôi muốn viết lisp để nhập lệnh "le" rồi pick 3 điểm có ngay kết quả mà thử mãi không được. (Trình lisp gà quá) Bác Hoành hay cao thủ nào giúp với.
  • 0
Becoming Rich - How to do It
http://waystobecomerich.com
Làm giầu quá khó

#908 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 18 March 2010 - 06:07 AM

Các bác ơi! Tôi dùng lệnh leader để vẽ mũi tên (dim leader) mà không muốn có text kèm theo nên thao tác thường là:
- Le, pick 3 điểm trên màn hình, Enter, Enter, n, Enter.
Tôi muốn viết lisp để nhập lệnh "le" rồi pick 3 điểm có ngay kết quả mà thử mãi không được. (Trình lisp gà quá) Bác Hoành hay cao thủ nào giúp với.

Bạn thử cái này nhé :
(defun c:drl() (command "leader" pause pause pause "" "" "N") (princ))

  • 1

#909 kieumanh

kieumanh

    biết vẽ rectang

  • Members
  • PipPip
  • 86 Bài viết
Điểm đánh giá: 140 (tàm tạm)

Đã gửi 18 March 2010 - 08:59 AM

Hải Phòng có đường Đà Nẵng, Đà Nẵng có đường Hải Phòng. Cám ơn bác nhé. A e nhiệt tình quá, mới hỏi hôm qua đã có bác giúp rồi. Đa tạ, đa tạ.
  • 0
Becoming Rich - How to do It
http://waystobecomerich.com
Làm giầu quá khó

#910 missyoutd01

missyoutd01

    biết pan

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

Đã gửi 18 March 2010 - 02:55 PM

Em đang cần đoạn lips hỗ trợ việc tạo các Line Type chuẩn cho từng khổ giấy A0, A1, A2, A3, A4. Ví dụ layer tim là đường đứt nét với khổ A0, sẽ khác với đường tim đứt nét ở khổ A4... Vậy cao thủ nào biết về lips lập hộ luôn cho em layer tim và layer khuất theo từng khổ giấy luôn, để em khỏi phải vào layer căn chỉnh, em cảm ơn nhiều :X
http://www.cadviet.c...g_kho_giay1.dwg



Tiện thể nhờ anh em giúp hộ mình lập lips làm ẩn blog này so với blog kia khi 2 blog trùng nhau, có bản vẽ ở dưới. Mong các bác giúp cho em một tay. Thanks các đại ka fát nữa hehhehe
http://www.cadviet.c...a_che_khuat.dwg
  • 0

#911 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 18 March 2010 - 03:36 PM

.......
Tiện thể nhờ anh em giúp hộ mình lập lips làm ẩn blog này so với blog kia khi 2 blog trùng nhau, có bản vẽ ở dưới. Mong các bác giúp cho em một tay. Thanks các đại ka fát nữa hehhehe
http://www.cadviet.c...a_che_khuat.dwg

Có phải ý của bạn như thế này :
Kích vào Block đó -> Xuất hiện mũi tên tam giác trỏ xuống (ở phía trên). Kích vào mũi tên tam giác đó và chọn Nha hoặc mái nhà nhé.
File đây :
http://www.cadviet.c...a_che_khuat.rar

Bạn có thể xem cách tạo nó ở đây :
http://www.cadviet.c...?showtopic=2511

Lưu ý : CAD2007 trở lên thì sử dụng được chức năng này. CAD2005,CAD2006 chưa thử. CAD2004 trở xuống không có chức năng này.
  • 0

#912 Ngolevietduc87

Ngolevietduc87

    Chưa sử dụng CAD

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

Đã gửi 19 March 2010 - 03:18 AM

Các bác có biết lisp nào cho phép đo khoảng cách từ tất cả các block trong bản vẽ đến 1 đường pline ,sau đó xuất ra file exel tọa độ của các block đó kèm theo khoảng cách đến đường pline không ạ?Hoặc cái gì tương tự thế cũng được.Dưới đây là file đính kèm
http://www.cadviet.c...es/2/vidu_1.dwg
Mong được mọi người giúp đỡ!
  • 0

#913 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 19 March 2010 - 11:55 AM

Các bác có biết lisp nào cho phép đo khoảng cách từ tất cả các block trong bản vẽ đến 1 đường pline ,sau đó xuất ra file exel tọa độ của các block đó kèm theo khoảng cách đến đường pline không ạ?Hoặc cái gì tương tự thế cũng được.Dưới đây là file đính kèm
http://www.cadviet.c...es/2/vidu_1.dwg
Mong được mọi người giúp đỡ!

Chào bạn Ngolevietduc87,
Có phải bạn muốn đo khoảng cách từ điểm chèn của block tới đường line hay không???? Và tọa độ bạn nói là tọa độ của điểm chèn ????
Vì không mở được file của bạn nên chưa hiểu rõ điều bạn cần.( Mình xài Cad2004).
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#914 missyoutd01

missyoutd01

    biết pan

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

Đã gửi 19 March 2010 - 04:30 PM

Có phải ý của bạn như thế này :
Kích vào Block đó -> Xuất hiện mũi tên tam giác trỏ xuống (ở phía trên). Kích vào mũi tên tam giác đó và chọn Nha hoặc mái nhà nhé.
File đây :
http://www.cadviet.c...a_che_khuat.rar

Trước tiên mình chân thành cảm ơn bạn Tue_NV, nhưng ý mình không phải như bạn nghĩ, ý mình là: Mình đã có bản vẽ sẵn đó ( bản vẽ mình đã upload) bản vẽ đó do người khác lập nên, mình thấy trong bản vẽ đó có 2 đối tượng blog, 1 là blog Mặt Bằng và 1 là blog Mái. Mình thấy blog Mặt Bằng bị che bằng blog Mái, vậy người ta đã dùng lệnh gì để có thể che blog Mặt Bằng bằng blog mái được?! Hiện tại mình đang có 1 bản vẽ khác gồm, 1 blog Mặt Bằng và 1 là blog Mái và nhiệm vụ của mình là che blog Mặt bằng bằng blog Mái khi 2 blog đó trùng nhau! ( tức là blog này ẩn so với blog kia thì dung lệnh gì ? )
  • 0

#915 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 19 March 2010 - 05:09 PM

Trước tiên mình chân thành cảm ơn bạn Tue_NV, nhưng ý mình không phải như bạn nghĩ, ý mình là: Mình đã có bản vẽ sẵn đó ( bản vẽ mình đã upload) bản vẽ đó do người khác lập nên, mình thấy trong bản vẽ đó có 2 đối tượng blog, 1 là blog Mặt Bằng và 1 là blog Mái. Mình thấy blog Mặt Bằng bị che bằng blog Mái, vậy người ta đã dùng lệnh gì để có thể che blog Mặt Bằng bằng blog mái được?! Hiện tại mình đang có 1 bản vẽ khác gồm, 1 blog Mặt Bằng và 1 là blog Mái và nhiệm vụ của mình là che blog Mặt bằng bằng blog Mái khi 2 blog đó trùng nhau! ( tức là blog này ẩn so với blog kia thì dung lệnh gì ? )

Có phải ý của bạn như thế này :
http://www.cadviet.c...es/2/tue_nv.dwg
PS : Bạn ghi đúng chính tả nhé Block chứ không phải Blog
Đó là 1 Block chứ không phải là 2 Block như điều bạn nói.

@ bác PhamThanhBinh : Đó là 1 Block chứ không phải là 2 Block bác ạ
  • 0

#916 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 19 March 2010 - 05:16 PM

Trước tiên mình chân thành cảm ơn bạn Tue_NV, nhưng ý mình không phải như bạn nghĩ, ý mình là: Mình đã có bản vẽ sẵn đó ( bản vẽ mình đã upload) bản vẽ đó do người khác lập nên, mình thấy trong bản vẽ đó có 2 đối tượng blog, 1 là blog Mặt Bằng và 1 là blog Mái. Mình thấy blog Mặt Bằng bị che bằng blog Mái, vậy người ta đã dùng lệnh gì để có thể che blog Mặt Bằng bằng blog mái được?! Hiện tại mình đang có 1 bản vẽ khác gồm, 1 blog Mặt Bằng và 1 là blog Mái và nhiệm vụ của mình là che blog Mặt bằng bằng blog Mái khi 2 blog đó trùng nhau! ( tức là blog này ẩn so với blog kia thì dung lệnh gì ? )

Chào bạn missyuotd01,
Bạn thử xài hai lệnh bring to front và send to back chưa nhỉ. Lệnh này dùng kết hợp với layer, nếu bạn cho hai cái block của bạn nằm trên hai layer khác nhau thì điều bạn muốn sẽ dễ dàng thực hiện.
Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#917 Ngolevietduc87

Ngolevietduc87

    Chưa sử dụng CAD

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

Đã gửi 19 March 2010 - 11:10 PM

Chào bạn Ngolevietduc87,
Có phải bạn muốn đo khoảng cách từ điểm chèn của block tới đường line hay không???? Và tọa độ bạn nói là tọa độ của điểm chèn ????
Vì không mở được file của bạn nên chưa hiểu rõ điều bạn cần.( Mình xài Cad2004).

Cảm ơn bác PhamThanhBinh đã quan tâm!
Bác hiểu đúng ý em cần rồi,nhưng không phải là đường Line mà là Polyline (ở trong bản vẽ của em cũng là Polyline)
Sau đây em xin up lại file cad ver2004: http://www.cadviet.c...es/2/vidu_2.dwg
Mong bác và các Pro khác giúp đỡ
Thanks!
  • 0

#918 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 20 March 2010 - 01:59 PM

Cảm ơn bác PhamThanhBinh đã quan tâm!
Bác hiểu đúng ý em cần rồi,nhưng không phải là đường Line mà là Polyline (ở trong bản vẽ của em cũng là Polyline)
Sau đây em xin up lại file cad ver2004: http://www.cadviet.c...es/2/vidu_2.dwg
Mong bác và các Pro khác giúp đỡ
Thanks!

Chào bạn Ngolevietduc87,
Bạn dùng thử cái lisp này và cho ý kiến nhé.
Bạn lưu ý rằng do bạn không nói rõ cái khoảng cách từ điểm chèn block tới đường polyline chuẩn bạn chọn như thế nào nên mình cứ hiểu đơn giản rằng đó là khoảng cách ngắn nhất tính từ điểm đó tới một điểm khác trên polyline. Nếu bạn không sử dụng theo định nghĩa này thì kết quả khoảng cách này sẽ sai đấy nhé.
Trong lisp này, yêu cầu bạn phải nhập đúng cái tên của block và tên layer chứa block. Nếu bạn nhập sai, lisp sẽ không chạy đâu.
Lisp này cũng mới dừng lại ở việc xuất ra bản vẽ cái bảng kết quả. Nếu bạn muốn xuất sang excel thì bạn cần thêm một đoạn code khác nữa.
Nó đây:

(defun c:lb1 ()
(vl-load-com)
(command "undo" "be")
(setq li1 (list)
blk (entsel "\n Hay chon block mau")
bln (cdr (assoc 2 (entget (car blk))))
lan (cdr (assoc 8 (entget (car blk))))
ss (ssget "x" (list ( cons 0 "INSERT") (cons 2 bln) (cons 8 lan)))
n (sslength ss)
i 0
)
(if (/= n nil)
(progn
(while (< i n)
(setq li1 (append li1 (list (cdr (assoc 10 (entget (ssname ss i))))))
i (1+ i))
)
)
)
li1
(setq en (car (entsel "\n Chon duong chuan"))
li2 (list)
ob (vlax-ename->vla-object en)
)
(foreach p li1
(setq p0 (vlax-curve-getClosestPointTo ob p acExtendNone)
d (distance p p0)
li2 (append li2 (list d))
)
)
(setq pb (getpoint "\n Chon diem nhap bang ket qua")
h (getreal "\n Nhap chieu cao chu: ")
k (getreal "\ Nhap do rong cot: ")
)
(entmake (list (cons 0 "TEXT") (cons 10 pb) (cons 40 h) (cons 1 "BANG KET QUA")))
;;;;(command "text" pb h 0 "BANG KET QUA")
(entmake (list (cons 0 "TEXT") (cons 10 (list (car pb) (- (cadr pb) (* 1.5 h)))) (cons 40 h) (cons 1 "STT")))
;;;(command "text" (list (car pb) (- (cadr pb) (* 1.5 h))) h 0 "STT")
(entmake (list (cons 0 "TEXT") (cons 10 (list (+ (car pb) k) (- (cadr pb) (* 1.5 h)))) (cons 40 h) (cons 1 "X")))
;;;(command "text" (list (+ (car pb) k) (- (cadr pb) (* 1.5 h))) h 0 "X")
(entmake
(list (cons 0 "TEXT") (cons 10 (list (+ (car pb) (* 2 k)) (- (cadr pb) (* 1.5 h)))) (cons 40 h) (cons 1 "Y")))
;;;(command "text" (list (+ (car pb) (* 2 k)) (- (cadr pb) (* 1.5 h))) h 0 "Y")
(entmake
(list
(cons 0 "TEXT") (cons 10 (list (+ (car pb) (* 3 k)) (- (cadr pb) (* 1.5 h)))) (cons 40 h) (cons 1 "Khoang cach")))
;;;(command "text" (list (+ (car pb) (* 3 k)) (- (cadr pb) (* 1.5 h))) h 0 "Khoang cach")
(setq a 0)
(while (< a n)
(setq b (nth a li1)
y (- (cadr pb) (* (+ 2 a) 1.5 h))
)
(entmake (list (cons 0 "TEXT") (cons 10 (list (car pb) y)) (cons 40 h) (cons 1 (rtos (1+ a) 2 0))))
;;;(command "text" (list (car pb) y) h 0 (rtos (1+ a) 2 0))
(entmake (list (cons 0 "TEXT") (cons 10 (list (+ (car pb) k) y)) (cons 40 h) (cons 1 (rtos (car b ) 2 2))))
;;;(command "text" (list (+ (car pb) k) y) h 0 (rtos (car b ) 2 2))
(entmake (list (cons 0 "TEXT") (cons 10 (list (+ (car pb) (* 2 k)) y)) (cons 40 h) (cons 1 (rtos (cadr b ) 2 2))))
;;;(command "text" (list (+ (car pb) (* 2 k)) y) h 0 (rtos (cadr b ) 2 2))
(entmake (list (cons 0 "TEXT") (cons 10 (list (+ (car pb) (* 3 k)) y)) (cons 40 h) (cons 1 (rtos (nth a li2) 2 2))))
;;;(command "text" (list (+ (car pb) (* 3 k)) y) h 0 (rtos (nth a li2) 2 2))
(setq a (1+ a))
)
(command "undo" "e")
(princ)
)



Và đây là cái kết quả mà mình đã chạy với file bạn gửi:
http://www.cadviet.c...files/2/lb1.jpg

Nếu có gì chưa hài lòng bạn hãy post lên nhé.
Chúc bạn vui.

Bài viết được chỉnh sửa bởi Phạm Thanh Bình theo sự góp ý của bác Tue_NV
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#919 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 20 March 2010 - 05:37 PM

Chào bạn Ngolevietduc87,
Bạn dùng thử cái lisp này và cho ý kiến nhé.
Bạn lưu ý rằng do bạn không nói rõ cái khoảng cách từ điểm chèn block tới đường polyline chuẩn bạn chọn như thế nào nên mình cứ hiểu đơn giản rằng đó là khoảng cách ngắn nhất tính từ điểm đó tới một điểm khác trên polyline. Nếu bạn không sử dụng theo định nghĩa này thì kết quả khoảng cách này sẽ sai đấy nhé.
Trong lisp này, yêu cầu bạn phải nhập đúng cái tên của block và tên layer chứa block. Nếu bạn nhập sai, lisp sẽ không chạy đâu.
Lisp này cũng mới dừng lại ở việc xuất ra bản vẽ cái bảng kết quả. Nếu bạn muốn xuất sang excel thì bạn cần thêm một đoạn code khác nữa.
Nó đây:


(defun c:lb1 ()
(vl-load-com)
(command "undo" "be")
(setq li1 (list)
bln (getstring "\n Nhap ten block: ")
lan (getstring "\n Nhap ten layer: ")
ss (ssget "x" (list ( cons 0 "INSERT") (cons 2 bln) (cons 8 lan)))
n (sslength ss)
i 0
)
(if (/= n nil)
(progn
(while (< i n)
(setq li1 (append li1 (list (cdr (assoc 10 (entget (ssname ss i))))))
i (1+ i))
)
)
)
li1
(setq en (car (entsel "\n Chon duong chuan"))
li2 (list)
ob (vlax-ename->vla-object en)
)
(foreach p li1
(setq p0 (vlax-curve-getClosestPointTo ob p acExtendNone)
d (distance p p0)
li2 (append li2 (list d))
)
)
(setq pb (getpoint "\n Chon diem nhap bang ket qua")
h (getreal "\n Nhap chieu cao chu: ")
k (getreal "\ Nhap do rong cot: ")
)
(command "text" pb h 0 "BANG KET QUA")
(command "text" (list (car pb) (- (cadr pb) (* 1.5 h))) h 0 "STT")
(command "text" (list (+ (car pb) k) (- (cadr pb) (* 1.5 h))) h 0 "X")
(command "text" (list (+ (car pb) (* 2 k)) (- (cadr pb) (* 1.5 h))) h 0 "Y")
(command "text" (list (+ (car pb) (* 3 k)) (- (cadr pb) (* 1.5 h))) h 0 "Khoang cach")
(setq a 0)
(while (< a n)
(setq b (nth a li1)
y (- (cadr pb) (* (+ 2 a) 1.5 h))
)
(command "text" (list (car pb) y) h 0 (rtos (1+ a) 2 0))
(command "text" (list (+ (car pb) k) y) h 0 (rtos (car b ) 2 2))
(command "text" (list (+ (car pb) (* 2 k)) y) h 0 (rtos (cadr b ) 2 2))
(command "text" (list (+ (car pb) (* 3 k)) y) h 0 (rtos (nth a li2) 2 2))
(setq a (1+ a))
)
(command "undo" "e")
(princ)
)


Và đây là cái kết quả mà mình đã chạy với file bạn gửi:
http://www.cadviet.c...files/2/lb1.jpg

Nếu có gì chưa hài lòng bạn hãy post lên nhé.
Chúc bạn vui.

Tue_NV có mấy lời góp ý với Lisp của bác PhamThanhBinh :
1. Kết quả Lisp sẽ chạy sai khi chiều cao của style hiện hành khác 0 trong hộp thoại Style. Muốn Lisp chạy đúng cho mọi trường hợp thì phải thiết lập chiều cao của style hiện hành bằng 0
Cách khác hay hơn là bác thiết lập việc ghi chữ bằng hàm entmake

2. Việc sử dụng hàm (ssget "X") khiến cho toàn bộ Block trên bản vẽ mang tên bln "đi vào" bảng thống kê. Có thể bỏ chữ "X" trong hàm (ssget)

3. Thay vì "nhập đúng cái tên của block và tên layer chứa block" -> bác nên cho mã lệnh pick chọn 1 block mẫu -> ta lấy tên Block chọn theo Block mẫu này
Hơn nữa, việc dùng hàm (getstring "\n Nhap ten block: ") là chưa đúng lắm. Vì tên block có thể có khoảng trắng nhưng nếu bác dùng hàm như trên thì nhập không có khoảng trắng bác ạ.

Vài lời góp ý. Chúc bác cuối tuần vui vẻ.

-Nhìn vào hình vẽ mà bác đã upload cho bạn Ngolevietduc87 thì rõ ràng là bác đã cài đặt DWGgateway thì sao lại không mở được file của các Version CAD nhỉ?
  • 1

#920 missyoutd01

missyoutd01

    biết pan

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

Đã gửi 20 March 2010 - 07:10 PM

Cảm ơn bạn Tue_Vn và bạn Thanhbinh, bạn Tue đã làm đúng theo ý mình rồi, vậy bạn có thể chỉ cho mình cách nào để làm được như thế không? còn theo cách của Thanhbinh thì mình đã thử rồi ( mình dùng Draw Order rồi nhưng vẫn không được. Xin các cao thủ chỉ giáo giúp. Thanks
  • 0