Đế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

#1521 hoa35ktxd

hoa35ktxd

    biết lệnh move

  • Members
  • PipPipPip
  • 125 Bài viết
Điểm đánh giá: 38 (tàm tạm)

Đã gửi 13 August 2010 - 08:16 PM

Chưa có ai giúp mình cái này ??

Có phải bác muốn tạo thành Block có chứa 3 đối tượng: Point đồng thời là Basepoint và 2 Text liền kề ko?
Nếu đúng như thế tôi sẽ nghiên cứu.
  • 0

#1522 baodenhp

baodenhp

    biết vẽ arc

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

Đã gửi 14 August 2010 - 01:12 AM

Chào mọi người, E có bài toán về LISP mọi người xem giúp. E muốn chèn điểm độ cao từ file số liệu xyh theo định dạng file đính kèm [url="http://www.mediafire.com/?a5tzd3za0dr2q2h"] (file cad, lxs và scr). Thông số đầu vào như sau:
1. Tỷ lệ bản vẽ
2. Độ chính xác điểm cao độ (Precision)
với chiều cao text:
- phần số nguyên: 2.5mm x tỷ lệ bản vẽ
- phần thập phân: 1.7mm x tỷ lệ bản vẽ
Thanks!

Mong các Cao thủ quan tâm giúp đỡ, thanks nhiều nhiều!
  • 0

#1523 tnmtpc

tnmtpc

    biết dimcontinue

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

Đã gửi 14 August 2010 - 11:38 AM

Có phải bác muốn tạo thành Block có chứa 3 đối tượng: Point đồng thời là Basepoint và 2 Text liền kề ko?
Nếu đúng như thế tôi sẽ nghiên cứu.

Không phải block có 3 đối tượng, tương ứng với mỗi text sẽ chuyển thành một block có 1Tag với tên tag trùng tên block và thuộc một lớp riêng

Chào bác tnmtpc,
Thực ra mình cũng đã thử làm theo yêu cầu của bác nhưng quả thật là có chỗ bí. Nếu chỉ tạo thành một block thông thường thì có nhẽ có thể không phiền lắm, nhưng để tạo thành block có chứa các thuộc tính đúng như bác yêu cầu thì hơi gay. Cái bí nhất chính là làm sao chuyển được các mã dxf của các text đã có thành các mã chứa trong thuộc tính của block. Mình loay hoay mà chưa có giải pháp nào khả dĩ. Bác cố gắng chờ thêm vậy...
Chúc bác vui.

À mà sao mấy hôm nay không thể load mấy cái file bác gửi về để thí nghiệm cả bác ạ. Bác thử gửi lại xem nhé.

Link vẫn bình thường mà ,để mình gửi lại. Giúp mình nhé!
http://www.cadviet.c.../3/txttoblk.rar
  • 0

#1524 vothanhdn

vothanhdn

    biết vẽ ellipse

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

Đã gửi 14 August 2010 - 12:31 PM

Mấy anh ơi! có thể viết giùm e lisp này được không a
1. Chọn text
2. Nếu số đó là âm thì chuyển về layer "âm"
Nếu là dương thì chuyển về layer "dương"
E đang bí đoạn này, nó cứ bị lỗi hoài ah.
Thanks a lots!

  • 0

Ứng dụng hỗ trợ thiết kế mạng lưới thoát nước VTD

  - Tính toán mạng lưới thoát nước

  - Vẽ trắc dọc, bình đồ thoát nước

......

Truy cập http://www.vtdvn.com

------------------------------------------------------------------------------------------

"Không có gì chắc chắn, chỉ có 1 điều chắc chắn là không có gì chắc chắn"...!!!


#1525 dkkx3a

dkkx3a

    biết lệnh trim

  • Members
  • PipPipPip
  • 190 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 14 August 2010 - 01:38 PM

Mấy anh ơi! có thể viết giùm e lisp này được không a
1. Chọn text
2. Nếu số đó là âm thì chuyển về layer "âm"
Nếu là dương thì chuyển về layer "dương"
E đang bí đoạn này, nó cứ bị lỗi hoài ah.
Thanks a lots!


Còn Text không phải là số thì "xử" hắn ra sao bạn ???
  • 0
TỰ SỰ
Biển vào chiều buồn giữa cô liêu
Sóng vỗ bờ bạc đầu con nước
Khi biển động như lòng ta chợt động
Biển ồn ào nhưng thực rất dịu êm.......

#1526 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 August 2010 - 03:45 PM

Chào bác tnmtpc,
Thực ra mình cũng đã thử làm theo yêu cầu của bác nhưng quả thật là có chỗ bí. Nếu chỉ tạo thành một block thông thường thì có nhẽ có thể không phiền lắm, nhưng để tạo thành block có chứa các thuộc tính đúng như bác yêu cầu thì hơi gay. Cái bí nhất chính là làm sao chuyển được các mã dxf của các text đã có thành các mã chứa trong thuộc tính của block. Mình loay hoay mà chưa có giải pháp nào khả dĩ. Bác cố gắng chờ thêm vậy...
Chúc bác vui.

À mà sao mấy hôm nay không thể load mấy cái file bác gửi về để thí nghiệm cả bác ạ. Bác thử gửi lại xem nhé.

Chào bác Bình
Chổ bí của bác đã được Tue_NV giải đáp ở đây :
Lissp ttoa - Bai viet so 2432 và chổ bí của bác cũng được Tue_NV viết ngay trong bài viết này.
Bạn tnmpc, bác Bình thử nhé :
Đây là code :

(defun c:ttoa()
(vl-load-com)
(setvar "attreq" 1)
(command "undo" "be")
(setq p1 (getpoint "\n Chon diem thu nhat :"))
(setq p2 (getcorner p1 "\n Chon diem thu hai tao thanh cua so :"))

(setq dt1 (ssget "W" p1 p2 '((0 . "TEXT") (8 . "ELEVATIONS"))))
(setq dt2 (ssget "W" p1 p2 '((0 . "TEXT") (8 . "NUMBERS"))))

(vla-copy (vlax-ename->vla-object (ssname dt1 0)))
(setq ent (entlast) i 0 ss1 (ssadd))
(vla-copy (vlax-ename->vla-object (ssname dt2 0)))
(setq ent2 (entlast) j 0 ss2 (ssadd))
(setq tname "FPT_ALTTT")
(watt ent tname)

(setq tname2 "FPT_NUMTT")
(watt ent2 tname2)
(entdel ent) (entdel ent2)

(while (< i (sslength dt1))
(setq cont (dxf 1 (ssname dt1 i)))
(setq ins (dxf 10 (ssname dt1 i)))
(vl-cmdf "insert" tname ins 1 1 0 cont)
(entdel (ssname dt1 i))
(setq i (1+ i))
)
(while (< j (sslength dt2))
(setq cont (dxf 1 (ssname dt2 j)))
(setq ins (dxf 10 (ssname dt2 j)))
(vl-cmdf "insert" tname2 ins 1 1 0 cont)
(entdel (ssname dt1 j))
(setq j (1+ j))
)
(command "undo" "end")
(princ)
)
;
;
(defun dxf (code e)
(cdr (assoc code (entget e)))
)
;
;
(defun watt (ent tname / tval cao po10 po11 styl LA mau ang wid dxf71
dxf72 dxf73 promp)
(setq tval (dxf 1 ent))
(setq cao (dxf 40 ent))
(setq po10 (dxf 10 ent))
(setq po11 (dxf 11 ent))
(setq styl (dxf 7 ent))
(setq LA (dxf 8 ent))
(if (= (dxf 62 ent) nil)
(setq mau (cdr(assoc 62 (tblsearch "layer" LA))))
(setq mau (dxf 62 ent))
)
(setq ang (dxf 50 ent))
(setq wid (dxf 41 ent))
(setq dxf71 (dxf 71 ent))
(setq dxf72 (dxf 72 ent))
(setq dxf73 (dxf 73 ent))
(setq promp tname)
(setq ss1 (ssadd))
(setq e
(entmakex (list (cons 0 "ATTDEF") (cons 7 styl) (cons 62 mau)
(cons 2 Tname) (cons 3 promp) (cons 1 tval)
(cons 71 dxf71) (cons 72 dxf72) (cons 74 dxf73)
(cons 10 po10) (cons 11 po11) (cons 40 cao)
(cons 50 ang) (cons 41 wid)
'(70 . 0)
)
)
)
(setq ss1 (ssadd e ss1))
(command "copybase" po10 ss1 "")
(Command "pasteblock" po10)
(command "rename" "B" (dxf 2 (entlast)) tname)
(setq ss1 (ssadd))
(entdel e)
)

code có 1 điểm nhỏ chưa hoàn thiện. Các bác sử dụng xong sẽ thấy . Và vì không có thời gian rãnh nên Tue_NV chưa giải quyết nốt. Các bác ráng chờ vậy
Chúc các bác 1 ngày cuối tuần vui vẻ :(
  • 1

#1527 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 14 August 2010 - 04:47 PM

Không phải block có 3 đối tượng, tương ứng với mỗi text sẽ chuyển thành một block có 1Tag với tên tag trùng tên block và thuộc một lớp riêng
Link vẫn bình thường mà ,để mình gửi lại. Giúp mình nhé!
http://www.cadviet.c.../3/txttoblk.rar

Chào bạn tnmtpc,
Không biết cái này có đúng ý bạn không??? Do không thấy cái thuộc tính FPT_DES nên mình không tạo block cho cái thuộc tính này được. Các block FPT_ALT và FPT_NUM do trên bản vẽ bạn gửi đã có nên mình đổi tên nó là FPT_ALT1 và FPT_NUM1.
Block FPT_ALT1 có màu theo lớp của thuộc tính cao độ còn block FPT_NUM1 thì có màu theo lớp của thuộc tính tên điểm. Các block này khi bạn insert nó vào bản vẽ sẽ có lớp là lớp hiện hành của bản vẽ bạn ạ chứ không phải là chúng nằm trên các lớp khác nhau đâu...... Lớp (layer) chỉ là của thuộc tính mà thôi.
Việc tạo block cho thuộc tính FPT_DES theo mình nghĩ cũng tương tự như vậy song do chưa có cái mẫu nên mình chưa làm, bạn có thể tự làm tiếp nhé.
Lisp đây:

(defun c:atbl (/ en els ln st ht gt pt txt cl at1 at2 )
(command "undo" "be")
(setq cl (getvar "clayer"))
(setq en (car(entsel "\n Chon doi tuong cao do"))
els (entget en)
ln (cdr (assoc 8 els))
st (cdr (assoc 7 els))
ht (cdr (assoc 40 els))
gt (cdr (assoc 50 els))
pt (cdr (assoc 10 els))
txt (cdr(assoc 1 els))
)
(command "layer" "s" ln "")
(command "attdef" "v" "" "fpt_alt" "" txt "s" st pt ht gt)
(setq at1 (entlast))
(command "block" "FPT_ALT1" pt at1 "" )
(setq en (car(entsel "\n Chon doi tuong ten diem"))
els (entget en)
ln (cdr (assoc 8 els))
st (cdr (assoc 7 els))
ht (cdr (assoc 40 els))
gt (cdr (assoc 50 els))
pt (cdr (assoc 10 els))
txt (cdr(assoc 1 els))
)
(command "layer" "s" ln "")
(command "attdef" "v" "" "fpt_num" "" txt "s" st pt ht gt)
(setq at2 (entlast))
(command "block" "FPT_NUM1" pt at2 "" )
(command "layer" "s" cl "")
(command "undo" "e")
(princ)
)


Theo mình nghĩ thì bạn có thể tạo 1 block có chứa cả 2 (hay 3) thuộc tính là FPT_ALT, FPT_NUM, (FPT_DES) và cả point nữa sẽ tiện dụng hơn khi bạn phải sửa chữa nhiểu đối tượng bạn ạ.
Sau khi làm được các block này thì mình nghĩ việc giải quyết cái block chung đó không còn khó nữa bạ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.

#1528 tnmtpc

tnmtpc

    biết dimcontinue

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

Đã gửi 14 August 2010 - 07:50 PM

Chào bạn tnmtpc,
Không biết cái này có đúng ý bạn không??? Do không thấy cái thuộc tính FPT_DES nên mình không tạo block cho cái thuộc tính này được. Các block FPT_ALT và FPT_NUM do trên bản vẽ bạn gửi đã có nên mình đổi tên nó là FPT_ALT1 và FPT_NUM1.
Block FPT_ALT1 có màu theo lớp của thuộc tính cao độ còn block FPT_NUM1 thì có màu theo lớp của thuộc tính tên điểm. Các block này khi bạn insert nó vào bản vẽ sẽ có lớp là lớp hiện hành của bản vẽ bạn ạ chứ không phải là chúng nằm trên các lớp khác nhau đâu...... Lớp (layer) chỉ là của thuộc tính mà thôi.
Việc tạo block cho thuộc tính FPT_DES theo mình nghĩ cũng tương tự như vậy song do chưa có cái mẫu nên mình chưa làm, bạn có thể tự làm tiếp nhé.

Theo mình nghĩ thì bạn có thể tạo 1 block có chứa cả 2 (hay 3) thuộc tính là FPT_ALT, FPT_NUM, (FPT_DES) và cả point nữa sẽ tiện dụng hơn khi bạn phải sửa chữa nhiểu đối tượng bạn ạ.
Sau khi làm được các block này thì mình nghĩ việc giải quyết cái block chung đó không còn khó nữa bạn ạ.
Chúc bạn vui.

Cám ơn bạn đã quan tâm giúp mình, nhưng lisp không cho ra kết quả gì cả: sau khi gõ lệnh nó bảo chọn đối tượng cao độ, tiếp theo chọn đối tượng tên điểm, và dòng lệnh không nhắc làm gì cả, bản vẽ thì vẫn vậy. Tiếp tục gọi lệnh, nó bảo chọn đối tượng cao độ, chọn xong nó yêu cầu có định nghĩa lại hay không, kết quả nó tạo ra một block FPT_ALT đè lên text độ cao
Đây là nội dung hiển thị của dòng lệnh:
Command: atbl

Chon doi tuong cao do
Chon doi tuong ten diem
Command: atbl

Chon doi tuong cao do
Yes or No, please.
Redefine it? [Yes/No] : n

Nôm na là muốn chuyển nhanh từ bản vẽ một (textXYZ) sang bản vẽ hai (blockXYZ): các text trở thành block tương ứng, chọn hàng loạt chứ không phải pick từng cái một
bản vẽ dưới đây có chứa DES
http://www.cadviet.c...s/3/nxyzc_5.dwg
Chuyển các text trong bản vẽ này thành block
  • 0

#1529 hoa35ktxd

hoa35ktxd

    biết lệnh move

  • Members
  • PipPipPip
  • 125 Bài viết
Điểm đánh giá: 38 (tàm tạm)

Đã gửi 14 August 2010 - 10:48 PM

Gửi bác đoạn code sau xem có được không.
Vì trong bản vẽ của bác có sẵn các Block rồi nên tôi không tạo Block.
Nguyên lý hoạt động:
Chọn độ cao (đỏ), chọn điểm chèn (vàng), chọn số (xanh) của 1 cụm để tính toán khoảng cách của các Text với Point, cái này bác phải thống nhất với cách tạo Block của bác, sau đó chương trình sẽ xóa các Text đi và chèn Block tương ứng vào vị trí đó cho bác.
Loay hoay mãi vì không để ý bản vẽ của bác có các đối tượng nằm trên cao độ khác nhau nên cứ loạn xị ngậu.
(defun c:ATBL()
(setq CMD (getvar "CMDECHO")
OSM (getvar "OSMODE"))
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
(setq Alt (entget (setq Alt_Obj(car (entsel "\nChon doi tuong mau FPT_Alt: "))))
TxtAlt (cdr (assoc 1 Alt))
BasepointAlt (list (cadr (assoc 10 Alt)) (caddr (assoc 10 Alt)))
POINT (entget (car (entsel "\nChon diem chen doi tuong mau FPT_Alt: ")))
Basepoint (list (cadr (assoc 10 POINT)) (caddr (assoc 10 POINT)))
DistAlt (distance BasepointAlt Basepoint)
AngleAlt (Angle BasepointAlt Basepoint)
Num (entget (setq Num_Obj (car (entsel "\nChon doi tuong mau FPT_Num: "))))
TxtNum (cdr (assoc 1 Num))
BasepointNum (list (cadr (assoc 10 Num)) (caddr (assoc 10 Num)))
DistNum (distance BasepointNum Basepoint)
AngleNum (Angle BasepointNum Basepoint))
(setq SS (ssget "A" '((0 . "TEXT")))
SSL (sslength SS)
I 0)
(while (< I SSL)
(setq Obj (ssname SS I)
enObj (entget Obj)
Txt (cdr (assoc 1 enObj))
bPoint (list (cadr (assoc 10 enObj)) (caddr (assoc 10 enObj))))
(if (= (cdr (assoc 8 enObj)) "ELEVATIONS")
(progn
(setq InsPoint (polar bPoint AngleAlt DistAlt))
(setvar "CLAYER" "ELEVATIONS")
(command "Erase" Obj "")
(command "INSERT" "FPT_ALT" InsPoint "1" "1" "1" Txt))
)
(if (= (cdr (assoc 8 enObj)) "NUMBERS")
(progn
(setq InsPoint (polar bPoint AngleNum DistNum))
(setvar "CLAYER" "NUMBERS")
(command "Erase" Obj "")
(command "INSERT" "FPT_NUM" InsPoint "1" "1" "1" Txt))
)
(setq I (+ 1 I))
)
(setvar "CMDECHO" CMD)
(setvar "OSMODE" OSM)
)

  • 1

#1530 vothanhdn

vothanhdn

    biết vẽ ellipse

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

Đã gửi 15 August 2010 - 08:12 AM

Còn Text không phải là số thì "xử" hắn ra sao bạn ???

Text không phải là số thì e bó tay...
Text ở đây là số, nếu âm thì chuyển về layer "am", nếu dương thì chuyển về layer "duong"
  • 0

Ứng dụng hỗ trợ thiết kế mạng lưới thoát nước VTD

  - Tính toán mạng lưới thoát nước

  - Vẽ trắc dọc, bình đồ thoát nước

......

Truy cập http://www.vtdvn.com

------------------------------------------------------------------------------------------

"Không có gì chắc chắn, chỉ có 1 điều chắc chắn là không có gì chắc chắn"...!!!


#1531 tnmtpc

tnmtpc

    biết dimcontinue

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

Đã gửi 15 August 2010 - 10:06 AM

Gửi bác đoạn code sau xem có được không.
Vì trong bản vẽ của bác có sẵn các Block rồi nên tôi không tạo Block.
Nguyên lý hoạt động:
Chọn độ cao (đỏ), chọn điểm chèn (vàng), chọn số (xanh) của 1 cụm để tính toán khoảng cách của các Text với Point, cái này bác phải thống nhất với cách tạo Block của bác, sau đó chương trình sẽ xóa các Text đi và chèn Block tương ứng vào vị trí đó cho bác.
Loay hoay mãi vì không để ý bản vẽ của bác có các đối tượng nằm trên cao độ khác nhau nên cứ loạn xị ngậu.

Vẫn không làm được:
Sau khi gọi lệnh, Chọn độ cao (đỏ), chọn điểm chèn (vàng), chọn số (xanh)-> xuất iện hộp thoại Enter Attributes, và cứ thế mà OK mãi mãi, chẳng thấy có hiệu ứng gì. Các Bác xem lại giúp
Để thống nhất vị trí các thuộc tính của điểm ( NUM. ALT. DES) với điểm chèm, bản vẽ NXYZC.dwg đã được cập nhật lại ở link trên
  • 0

#1532 DuongTrungHuy

DuongTrungHuy

    biết lệnh copy

  • Members
  • PipPipPip
  • 116 Bài viết
Điểm đánh giá: 41 (tàm tạm)

Đã gửi 15 August 2010 - 10:47 AM

Không phải block có 3 đối tượng, tương ứng với mỗi text sẽ chuyển thành một block có 1Tag với tên tag trùng tên block và thuộc một lớp riêng
Link vẫn bình thường mà ,để mình gửi lại. Giúp mình nhé!
http://www.cadviet.c.../3/txttoblk.rar


Điểm Point của Cháu có dữ liệu mở rộng (mã -3).Cháu tìm cách lấy dữ liệu mở rộng đó ra là được
  • 0

#1533 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 16 August 2010 - 12:36 AM

Cám ơn bạn đã quan tâm giúp mình, nhưng lisp không cho ra kết quả gì cả: sau khi gõ lệnh nó bảo chọn đối tượng cao độ, tiếp theo chọn đối tượng tên điểm, và dòng lệnh không nhắc làm gì cả, bản vẽ thì vẫn vậy. Tiếp tục gọi lệnh, nó bảo chọn đối tượng cao độ, chọn xong nó yêu cầu có định nghĩa lại hay không, kết quả nó tạo ra một block FPT_ALT đè lên text độ cao
Đây là nội dung hiển thị của dòng lệnh:
Command: atbl

Chon doi tuong cao do
Chon doi tuong ten diem
Command: atbl

Chon doi tuong cao do
Yes or No, please.
Redefine it? [Yes/No] : n

Nôm na là muốn chuyển nhanh từ bản vẽ một (textXYZ) sang bản vẽ hai (blockXYZ): các text trở thành block tương ứng, chọn hàng loạt chứ không phải pick từng cái một
bản vẽ dưới đây có chứa DES
http://www.cadviet.c...s/3/nxyzc_5.dwg
Chuyển các text trong bản vẽ này thành block

Chào bác tnmtpc,
1/- Bác kiểm tra lại xem nha, thực tế bác chạy lisp đã có kết quả rồi đó, không tin bác hãy kiểm tra lại sẽ thấy trên bản vẽ của bác đã có các block thuộc tính là fpt_alt1 và fpt_num1. Đó chính là lý do khi bác chạy lại lisp lần thứ hai thì nó báo rằng đã có block tên như vậy rồi và bác có muốn xác định lại block này hay khong đó thôi.... Sở dĩ bác thấy trên bản vẽ chả thay đổi gì là do sau khi tạo block các đối tượng chọn để tạo block sẽ bị xóa đi, ở đây chính là cái thuộc tính fpt_alt và fpt_num đấy bác ạ. Còn lần sau bác chạy, cái thuộc tính ấy nó vẫn tòi ra là vì bác đã chọn n nghĩa là không tạo lại block mà.
Để hiểu rõ về các block này bác tham khảo thêm trong help của CAD sẽ thấy bác ạ....
2/- Mình cho rằng để thực hiện yêu cầu của bạn, trước hết phải tạo ra các block thuộc tính này đã, sau đó mới insert chúng vào vị trí của các text mà bác muốn thay bác ạ. Cái lisp của mình chỉ mới giải quyết vấn đề tạo ra các block thuộc tính mang tên là fpt_alt1 và fpt_num1 mà thôi. Còn việc thay thế nó vào bản vẽ mình chưa làm vì chưa rõ ý của bác. Việc mình post lisp này lên chủ yếu để bác kiểm tra xem có phải cái block thuộc tính bác cần là như cái block mình tạo ra hay không mà thôi. Nếu bác thấy các block này là đúng thì mình mới tính tới việc thay thế chúng vào bản vẽ của bác bác ạ.
3/- Bác hãy chạy thử lại lisp này với các bản vẽ chưa có block mang tên fpt_alt1 cũng như fpt_num1 và dùng lệnh insert block để insert các block này vào bản vẽ. Sau đó bác thử kiểm tra xem cái thuộc tính bác muốn có giống như vậy hay không??? Nếu đúng mình sẽ giúp bác giải quyết nốt vấn đề còn lại.

Chúc bác 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.

#1534 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 16 August 2010 - 01:10 AM

Vẫn không làm được:
Sau khi gọi lệnh, Chọn độ cao (đỏ), chọn điểm chèn (vàng), chọn số (xanh)-> xuất iện hộp thoại Enter Attributes, và cứ thế mà OK mãi mãi, chẳng thấy có hiệu ứng gì. Các Bác xem lại giúp
Để thống nhất vị trí các thuộc tính của điểm ( NUM. ALT. DES) với điểm chèm, bản vẽ NXYZC.dwg đã được cập nhật lại ở link trên

Chào bác tnmtpc,
Bác thử bổ sung vào dòng code :
(command "INSERT" "FPT_ALT" InsPoint "1" "1" "1" Txt)) thành (command "INSERT" "FPT_ALT" InsPoint "1" "1" "1" "" Txt)) xem bác nhé.
Tương tự với dòng code :
(command "INSERT" "FPT_NUM" InsPoint "1" "1" "1" Txt)) thành (command "INSERT" "FPT_ALT" InsPoint "1" "1" "1" "" Txt)).
Ở đây do là các block thuộc tính nên khi bác không nhập giá trị thuộc tính thì CAD cứ hỏi hoài thôi. Dấu "" thêm vào là để bỏ qua việc nhập góc xoay của block.
Trong đoạn code của bác hoa35ktxd do thiếu nó nên CAD hiểu txt ở đây là giá trị góc xoay. (Ấy là mình đoán vậy) nên nó cứ hỏi bác phải nhập giá trị của thuộc tính....
Bác thử lại nhé....
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1535 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 16 August 2010 - 02:50 AM

Cám ơn bạn đã quan tâm giúp mình, nhưng lisp không cho ra kết quả gì cả: sau khi gõ lệnh nó bảo chọn đối tượng cao độ, tiếp theo chọn đối tượng tên điểm, và dòng lệnh không nhắc làm gì cả, bản vẽ thì vẫn vậy. Tiếp tục gọi lệnh, nó bảo chọn đối tượng cao độ, chọn xong nó yêu cầu có định nghĩa lại hay không, kết quả nó tạo ra một block FPT_ALT đè lên text độ cao
Đây là nội dung hiển thị của dòng lệnh:
Command: atbl

Chon doi tuong cao do
Chon doi tuong ten diem
Command: atbl

Chon doi tuong cao do
Yes or No, please.
Redefine it? [Yes/No] : n

Nôm na là muốn chuyển nhanh từ bản vẽ một (textXYZ) sang bản vẽ hai (blockXYZ): các text trở thành block tương ứng, chọn hàng loạt chứ không phải pick từng cái một
bản vẽ dưới đây có chứa DES
http://www.cadviet.c...s/3/nxyzc_5.dwg
Chuyển các text trong bản vẽ này thành block

Chào bác tnmtpc,
Bác xài thử cái này nha.
Bác lưu ý như sau: khi dùng lệnh atbl lisp sẽ yêu cầu bác chọn một đối tượng cao độ, sau đó chọn một đối tượng tên điểm, rồi một đối tượng mô tả điểm. Lisp sẽ biến các đối tượng này thành các block thuộc tính tên là FPT_ALT1, FPT_NUM1, FPT_DES1. Sau đó sẽ có thông báo yêu cầu bạn chọn các đối tượng cần thay thế. Nhấn OK bác có thể chọn các đối tượng cần thay thế này bằng các phương pháp chọn của CAD như pick chọn, cửa sổ chọn...... Sau khi chọn xong bác nhấn enter lisp sẽ thay thế các đối tượng text được chọn bằng các block tương ứng. Nếu đối tượng text thuộc lớp elevations thì sẽ thay bằng block FPT_ALT1 , đối tượng text thuộc lớp NUMBRES sẽ được thay thế bằng block FPT_NUM1 và đối tượng text thuộc lớp DESCRIPTION sẽ được thay thế bằng block FPT_DES1.
Nếu trên bản vẽ đã có sẵn các block fpt_alt1, fpt_num1, fpt_des1 đúng như trên thì lisp sẽ bỏ qua việc tạo block và sẽ thay thế các block đó vào các text bạn muốn thay thế. Trường hợp các block có sẵn này không đúng với mong muốn, bạn hãy đổi tên các block đó trước khi bạn chạy lisp (sử dụng lệnh rename).
Hy vọng đúng ý bác muốn. Chúc bác vui.

(defun c:atbl (/ en els ln st ht gt pt txt cl at1 at2 at3 n i )
(command "undo" "be")
(setq cl (getvar "clayer"))
(if (= (tblsearch "block" "fpt_alt1") nil)
(progn
(setq en (car(entsel "\n Chon doi tuong cao do"))
els (entget en)
ln (cdr (assoc 8 els))
st (cdr (assoc 7 els))
ht (cdr (assoc 40 els))
gt (cdr (assoc 50 els))
pt (cdr (assoc 10 els))
txt (cdr(assoc 1 els))
)
(command "layer" "s" ln "")
(command "attdef" "v" "" "fpt_alt" "" txt "s" st pt ht gt)
(setq at1 (entlast))
(command "block" "FPT_ALT1" pt at1 "" )))
(if (= (tblsearch "block" "fpt_num1") nil)
(progn
(setq en (car(entsel "\n Chon doi tuong ten diem"))
els (entget en)
ln (cdr (assoc 8 els))
st (cdr (assoc 7 els))
ht (cdr (assoc 40 els))
gt (cdr (assoc 50 els))
pt (cdr (assoc 10 els))
txt (cdr(assoc 1 els))
)
(command "layer" "s" ln "")
(command "attdef" "v" "" "fpt_num" "" txt "s" st pt ht gt)
(setq at2 (entlast))
(command "block" "FPT_NUM1" pt at2 "" )))
(if (= (tblsearch "block" "fpt_des1") nil)
(progn
(setq en (car(entsel "\n Chon doi tuong mo ta diem"))
els (entget en)
ln (cdr (assoc 8 els))
st (cdr (assoc 7 els))
ht (cdr (assoc 40 els))
gt (cdr (assoc 50 els))
pt (cdr (assoc 10 els))
txt (cdr(assoc 1 els))
)
(command "layer" "s" ln "")
(command "attdef" "v" "" "fpt_des" "" txt "s" st pt ht gt)
(setq at3 (entlast))
(command "block" "FPT_DES1" pt at3 "" )))
(command "layer" "s" cl "")
(alert "\n Chon cac doi tuong can thay the")
(setq ss (ssget '((0 . "TEXT")))
n (sslength ss)
i 0)
(while (< i n)
(setq en (ssname ss i)
els (entget en)
ln (cdr (assoc 8 els))
st (cdr (assoc 7 els))
ht (cdr (assoc 40 els))
gt (cdr (assoc 50 els))
pt (cdr (assoc 10 els))
txt (cdr(assoc 1 els))
)
(if (= ln "ELEVATIONS")
(progn
(command "erase" en "")
(command "insert" "FPT_ALT1" pt "" "" "" txt "")))
(if (= ln "NUMBERS")
(progn
(command "erase" en "")
(command "insert" "FPT_NUM1" pt "" "" "" txt "")))
(if (= ln "DESCRIPTION")
(progn
(command "erase" en "")
(command "insert" "FPT_DES1" pt "" "" "" txt "")))
(setq i (1+ i))
)
(command "undo" "e")
(princ)
)



Bài được sửa bởi Phạm Thanh Bình ngày 16-8-2010 để bổ sung code lisp cho hoàn thiện
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1536 hoa35ktxd

hoa35ktxd

    biết lệnh move

  • Members
  • PipPipPip
  • 125 Bài viết
Điểm đánh giá: 38 (tàm tạm)

Đã gửi 16 August 2010 - 10:59 AM

Cảm ơn bác Phanthanhbinh đã có ý kiến về 3 tham số nhập vào khi Insert Block đó là ScaleX, ScaleY và Angle
Nguyên nhân xuất hiện hộp thoại là do chưa set biến hệ thống ATTDIA về 0, trên máy tôi biến này đã là 0 rồi nên không để ý.
Bổ sung thêm FPT_DES nhưng bác phải sửa lại điểm chèn của Block này cho đúng như vị chí nếu không kết quả chạy ra sẽ thấy khác với bản vẽ ban đầu.
Code sẽ được sửa lại như sau: (Đã test thành công trên máy của tôi)
(defun c:ATBL ()    
(setq CMD (getvar "CMDECHO")
OSM (getvar "OSMODE")
ATT (Getvar "ATTDIA")
CLAY (Getvar "CLAYER")

(setvar "CMDECHO" 0)   
(setvar "OSMODE" 0)
(setvar "ATTDIA" 0)
(setq POINT (entget (car (entsel "\nChon diem chen doi tuong mau FPT_Alt: ")))
Basepoint (list (cadr (assoc 10 POINT)) (caddr (assoc 10 POINT)))

Alt (entget (setq Alt_Obj (car (entsel "\nChon doi tuong mau FPT_Alt: "))))
TxtAlt (cdr (assoc 1 Alt))
BasepointAlt (list (cadr (assoc 10 Alt)) (caddr (assoc 10 Alt)))
DistAlt (distance BasepointAlt Basepoint)
AngleAlt(Angle BasepointAlt Basepoint)

Num (entget (setq Num_Obj (car (entsel "\nChon doi tuong mau FPT_Num: "))))
TxtNum (cdr (assoc 1 Num))
BasepointNum (list (cadr (assoc 10 Num)) (caddr (assoc 10 Num)))
DistNum (distance BasepointNum Basepoint)
AngleNum (Angle BasepointNum Basepoint)

DES (entget (setq Des_Obj (car (entsel "\nChon doi tuong mau FPT_DES: "))))
TxtDES (cdr (assoc 1 DES))
BasepointDES (list (cadr (assoc 10 DES)) (caddr (assoc 10 DES)))
DistDES (distance BasepointDES Basepoint)
AngleDES (Angle BasepointDES Basepoint)

SS (ssget "A" '((0 . "TEXT")))
SSL (sslength SS)
I 0
)   
(while (< I SSL)     
(setq Obj (ssname SS I)
enObj(entget Obj)
Txt (cdr (assoc 1 enObj))
bPoint (list (cadr (assoc 10 enObj)) (caddr (assoc 10 enObj)))
)
(if (= (cdr (assoc 8 enObj)) "ELEVATIONS")       
(progn     
(setq InsPoint (polar bPoint AngleAlt DistAlt))     
(setvar "CLAYER"    "ELEVATIONS")     
(command "Erase" Obj "")     
(command "INSERT" "FPT_ALT" InsPoint "1" "1" "" Txt)
)     
)     
(if (= (cdr (assoc 8 enObj)) "NUMBERS")       
(progn     
(setq InsPoint (polar bPoint AngleNum DistNum))     
(setvar "CLAYER"    "NUMBERS")     
(command "Erase" Obj "")     
(command "INSERT" "FPT_NUM" InsPoint "1" "1" "" Txt)
)     
)
(if (= (cdr (assoc 8 enObj)) "DESCRIPTION")       
(progn     
(setq InsPoint (polar bPoint AngleDES DistDES))     
(setvar "CLAYER"    "DESCRIPTION")     
(command "Erase" Obj "")     
(command "INSERT" "FPT_DES" InsPoint "1" "1" "" Txt)
)     
)    
(setq I (+ 1 I))   
)   
(setvar "CMDECHO" CMD)   
(setvar "OSMODE" OSM)
(Setvar "ATTDIA" ATT)
(Setvar "CLAYER" CLAY)
)

  • 2

#1537 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 16 August 2010 - 11:39 AM

Chào bác Bình
Chổ bí của bác đã được Tue_NV giải đáp ở đây :
Lissp ttoa - Bai viet so 2432 và chổ bí của bác cũng được Tue_NV viết ngay trong bài viết này.
Bạn tnmpc, bác Bình thử nhé :
Đây là code :

Chào bác Tue_NV,
Rất cám ơn bác đã hướng dẫn, tuy nhiên có chỗ mình chưa hiểu lắm là:
1/- Trong hai ví dụ bác đưa ra, bác sử dụng hai hàm khác nhau là entmake và entmakex để tạo đối tựơng thuộc tính. Vậy sự khác nhau của nó ra sao bác nhỉ???
Đọc trong help thì mình hiểu là hàm entmake không cho phép tạo các đối tượng có mã điều khiển (handle). Còn hàm entmakex thì có thể tạo được các đối tượng có các mã điều khiển (handle). Như vậy khi đối tượng không sử dụng mã điều khiển ta có thể sử dụng cả hai hàm này để tạo có phải không bác nhỉ???
2/- Trong đoạn lisp trên bác có dùng hàm (vla-copy .......). Vậy hàm này có thể tham khảo nó ở đâu và chức năng của nó có phải là để tạo ra một đối tượng mới trùng với đối tượng cũ hay không???
3/- Cái điểm chưa ưng ý của bác có phải là lisp chỉ chạy ngon khi trên bản vẽ chưa có block nào trùng tên với các block mà lisp sẽ tạo ra khi chạy (tức là fpt_attt hay fpt_numtt) hay không???
Nếu như vậy bác chỉ cần thêm vào các hàm điều kiện để kiểm tra nếu như chưa có các block này mới chạy các hàm (watt ....) của bác.

Chào bác, rất mong bác giải đáp....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1538 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 August 2010 - 12:02 PM

Chào bác Tue_NV,
Rất cám ơn bác đã hướng dẫn, tuy nhiên có chỗ mình chưa hiểu lắm là:
1/- Trong hai ví dụ bác đưa ra, bác sử dụng hai hàm khác nhau là entmake và entmakex để tạo đối tựơng thuộc tính. Vậy sự khác nhau của nó ra sao bác nhỉ???
Đọc trong help thì mình hiểu là hàm entmake không cho phép tạo các đối tượng có mã điều khiển (handle). Còn hàm entmakex thì có thể tạo được các đối tượng có các mã điều khiển (handle). Như vậy khi đối tượng không sử dụng mã điều khiển ta có thể sử dụng cả hai hàm này để tạo có phải không bác nhỉ???
2/- Trong đoạn lisp trên bác có dùng hàm (vla-copy .......). Vậy hàm này có thể tham khảo nó ở đâu và chức năng của nó có phải là để tạo ra một đối tượng mới trùng với đối tượng cũ hay không???
3/- Cái điểm chưa ưng ý của bác có phải là lisp chỉ chạy ngon khi trên bản vẽ chưa có block nào trùng tên với các block mà lisp sẽ tạo ra khi chạy (tức là fpt_attt hay fpt_numtt hay không???
Nếu như vậy bác chỉ cần thêm vào các hàm điều kiện để kiểm tra nếu như chưa có các block này mới chạy các hàm (watt ....) của bác.

Chào bác, rất mong bác giải đáp....

Entmake và entmakex giống nhau ở chổ là tạo mới đối tượng.
Nhưng khác nhau ở chổ entmakex vừa tạo ra được đối tượng, vừa trả về kiểu Entity của đối tượng đó

1. Bác Bình có thể xem 2 ví dụ trong help sẽ hiểu :
(entmake '((0 . "CIRCLE") (62 . 1) (10 4.0 4.0 0.0) (40 . 1.0)))

((0 . "CIRCLE") (62 . 1) (10 4.0 4.0 0.0) (40 . 1.0))

(entmakex '((0 . "CIRCLE") (62 . 1) (10 4.0 3.0 0.0) (40 . 1.0)))


Chức năng của vla-copy và cái điều mà Tue_NV chưa ưng ý như bác nói và hướng xử lý y như bác nói vậy

@Hoa35ktxd : Còn 1 biến nữa mà có lẽ bác đã quên. Đó là biến Attreq
  • 2

#1539 hoa35ktxd

hoa35ktxd

    biết lệnh move

  • Members
  • PipPipPip
  • 125 Bài viết
Điểm đánh giá: 38 (tàm tạm)

Đã gửi 16 August 2010 - 05:19 PM

Hì, đúng ra cẩn thận thì phải thêm biến ATTGEQ nữa nhưng thấy bác ấy nói là đã xuất hiện hộp thoại rồi nên tôi biết biến đó đang có giá trị là 1 do đó tôi không thêm.
  • 0

#1540 tnmtpc

tnmtpc

    biết dimcontinue

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

Đã gửi 16 August 2010 - 09:17 PM

Cám ơn Phamthanhbinh, hoa35ktxd . cả hai lisp đều hoạt động tốt, lúc đầu mình chạy lisp của Phamthanhbinh lại bị xuất hiện hộp thoại và bắt nhập giá trị các thuộc tính, sau đó chạy lisp của hoa35ktxd thì ổn và chạy lại lisp của Phamthanhbinh (lúc này đã thiết lập ATTDIA về 0) kết quả như ý. Tuy nhiên cả hai lisp còn một chút xíu lỗi là trong trường hợp bản vẽ không có mô tả (DES) thì không lấy gì để chọn, nếu Enter thì không cho kết quả chuyển đổi block. Đây là trường hợp sẽ gặp, thường thì file dữ liệu khi nhập khẩu điểm vào Cad bắt buột phải có là tên điểm(NUM), điểm chèn (POINT), còn các thuộc tính khác như độ cao (ALT) chỉ có trong bản vẽ địa hình, địa chính thì không, mô tả điểm (DES) có thể có hoặc không. Hai lisp trên áp dụng tốt cho trường hợp của mình, ở đây mình muốn lisp áp dụng phổ biến cho nhiều trường hợp, do vậy các bạn có thể chỉnh sửa lại những thuộc tính nào không có (ALT hoặc DES) thì trả lời tại dòng nhắc lệnh là Enter, các thuộc tính nào có thì chuyển block bình thường.
Lần nữa cám ơn các bạn
  • 1