Đến nội dung


Hình ảnh
- - - - -

lấy thuộc tính từ block


  • Please log in to reply
12 replies to this topic

#1 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 04 January 2008 - 07:56 AM

pác hoanh và bac ssg đã trả lời rồi nhưng thực sự tôi vẫn thấy lơn mơ quá các pác có thể cho hẳn mình một đoạn code giải bài này rồi mình mới tiếp tục cuộc hành trình được:
- có một loạt block trên bản vẽ (thuộc tính caodoht, caodotk, chenhcao) và một đôi text (màu xanh, màu đỏ chẵn hạn)
- hô xung phong một pác lấy thằng text màu xanh gần nhất (điểm chèn block) gán cho caodoht, text màu đỏ cũng gần nhất cho caodotk; tính chenhcao=caotk-caodoht
một đoạn khác:
chọn vài block
thôi các pác chỉ giup thế này cho dễ hiểu
- chọn vài block có thuộc tính như nói trên : hô xung phong nữa thì sinh ra thằng text màu xanh màu đỏ tại điểm chèn chẵn hạn
- với lại làm sao để mình bỏ cái block vào đây để các pạn dễ hình dung hoặc đoạn code của minh chẳn hạn
hì hì cam ơn
  • 0

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 January 2008 - 02:33 PM

pác hoanh và bac ssg đã trả lời rồi nhưng thực sự tôi vẫn thấy lơn mơ quá các pác có thể cho hẳn mình một đoạn code giải bài này rồi mình mới tiếp tục cuộc hành trình được:
- có một loạt block trên bản vẽ (thuộc tính caodoht, caodotk, chenhcao) và một đôi text (màu xanh, màu đỏ chẵn hạn)
- hô xung phong một pác lấy thằng text màu xanh gần nhất (điểm chèn block) gán cho caodoht, text màu đỏ cũng gần nhất cho caodotk; tính chenhcao=caotk-caodoht
một đoạn khác:
chọn vài block
thôi các pác chỉ giup thế này cho dễ hiểu
- chọn vài block có thuộc tính như nói trên : hô xung phong nữa thì sinh ra thằng text màu xanh màu đỏ tại điểm chèn chẵn hạn
- với lại làm sao để mình bỏ cái block vào đây để các pạn dễ hình dung hoặc đoạn code của minh chẳn hạn
hì hì cam ơn

Hiểu lơ mơ, chưa chắc lắm. Bạn post lên 1 bản vẽ *.dwg làm ví dụ thì hay hơn. Chức năng up của diễn đàn hình như chưa ổn. Bạn có thể dùng các Free Host để up. Nhiều lắm, ví dụ như:
http://www.mediafire.com/
Vào đó đăng ký (Create a Free Account), up file rồi copy link, paste vào bài viết là xong ngay.
  • 0

#3 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 08 January 2008 - 05:36 PM

Hiểu lơ mơ, chưa chắc lắm. Bạn post lên 1 bản vẽ *.dwg làm ví dụ thì hay hơn. Chức năng up của diễn đàn hình như chưa ổn. Bạn có thể dùng các Free Host để up. Nhiều lắm, ví dụ như:
<a href="http://www.mediafire.com/" target="_blank">http://www.mediafire.com/</a>
Vào đó đăng ký (Create a Free Account), up file rồi copy link, paste vào bài viết là xong ngay.

Cám ơn ssg đã chỉ giúp: block đây
http://www.cadviet.c.../hoihoanh_2.dwg
trước nhất dùng bộ lock để quét toàn bộ các đối tượng text xanh, text đỏ, block (có thể quét riêng cho từng loại)
chương trình sẽ cập nhật dữ liệu của text xanh vao CD_HT text đỏ vào CD_TK sau đó cập nhật CC bằng hiệu CD_TK-CD_HT
  • 0

#4 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 08 January 2008 - 05:40 PM

Cám ơn ssg đã chỉ giúp: block đây
http://www.cadviet.com/upfiles/hoihoanh_2.dwg
trước nhất dùng bộ lock để quét toàn bộ các đối tượng text xanh, text đỏ, block (có thể quét riêng cho từng loại)
chương trình sẽ cập nhật dữ liệu của text xanh vao CD_HT text đỏ vào CD_TK sau đó cập nhật CC bằng hiệu CD_TK-CD_HT

ngược lại chọn tập hợp text thì viết tất cả thông số CD_HT (text xanh) và CD_TK (text đỏ) và CC text vàng chẳn hạn
cám ơn nhiều
  • 0

#5 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 09 January 2008 - 03:58 PM

Cám ơn ssg đã chỉ giúp: block đây
http://www.cadviet.com/upfiles/hoihoanh_2.dwg
trước nhất dùng bộ lock để quét toàn bộ các đối tượng text xanh, text đỏ, block (có thể quét riêng cho từng loại)
chương trình sẽ cập nhật dữ liệu của text xanh vao CD_HT text đỏ vào CD_TK sau đó cập nhật CC bằng hiệu CD_TK-CD_HT

Chương trình dành cho bạn đây, kèm theo comment cho từng dòng lệnh.
Lưu ý: block của bạn chứa các attrib: CD_TN, CD_TK và CH_CAO phải được xếp đúng theo thứ tự đã nêu (nếu không sẽ xảy ra tình trạng "râu ông nọ cắm cằm bà kia"). Không đúng thứ tự cũng được nhưng phải viết lại code.
Bạn hiểu được toàn bộ code dưới đây sẽ tự bổ sung, phát triển chương trình theo ý thích. Mình vẫn khuyến khích các bạn tự làm, vướng mắc chỗ nào mình sẵn sàng giải đáp hoặc gợi ý thêm.


;;;--------------------------------------------------------------------
(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0 Le nil)
(repeat (sslength ss)
(setq
e (ssname ss i)
Le (append Le (list e))
i (1+ i)
)
)
Le
)
;;;--------------------------------------------------------------------
(defun getntv(sst p / Lt) ;;;Get Nearest Text Value in sst from p
(setq
Lt (ss2ent sst)
neap (lambda (x y)
(<
(distance p (cdr (assoc 10 (entget x))))
(distance p (cdr (assoc 10 (entget y))))
)
)
Lt (vl-sort Lt 'neap)
)
(cdr (assoc 1 (entget (car Lt))))
)
;;;--------------------------------------------------------------------
(defun C:UPH(/ e p t1 t2 t3 e1 e2 e3 d1 d2 d3) ;;;UPdate Height
(setq
e (car (entsel "\nSelect height block:")) ;;;Select block
p (cdr (assoc 10 (entget e))) ;;;Insert point of block
t1 (getntv (ssget "X" '((0 . "TEXT") (62 . 3))) p) ;;;Green text value nearest from p
t2 (getntv (ssget "X" '((0 . "TEXT") (62 . 1))) p) ;;;Red text value nearest from p
t3 (rtos (- (atof t2) (atof t1))) ;;;Subtract
e1 (entnext e) ;;;Attrib CD_TN entity
e2 (entnext e1) ;;;Attrib CD_TK entity
e3 (entnext e2) ;;;Attrib CH_CAO entity
d1 (entget e1) ;;;Get data1
d1 (subst (cons 1 t1) (assoc 1 d1) d1) ;;;Change data1
d2 (entget e2) ;;;Get data2
d2 (subst (cons 1 t2) (assoc 1 d2) d2) ;;;Change data2
d3 (entget e3) ;;;Get data3
d3 (subst (cons 1 t3) (assoc 1 d3) d3) ;;;Change data3
)
(entmod d1) ;;;Modify e1
(entmod d2) ;;;Modify e2
(entmod d3) ;;;Modify e3
(command "regen") ;;;Regenerating
(princ) ;;;Silent quit
)
;;;--------------------------------------------------------------------

  • 0

#6 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 11 January 2008 - 10:51 AM

Chương trình dành cho bạn đây, kèm theo comment cho từng dòng lệnh.
Lưu ý: block của bạn chứa các attrib: CD_TN, CD_TK và CH_CAO phải được xếp đúng theo thứ tự đã nêu (nếu không sẽ xảy ra tình trạng "râu ông nọ cắm cằm bà kia"). Không đúng thứ tự cũng được nhưng phải viết lại code.
Bạn hiểu được toàn bộ code dưới đây sẽ tự bổ sung, phát triển chương trình theo ý thích. Mình vẫn khuyến khích các bạn tự làm, vướng mắc chỗ nào mình sẵn sàng giải đáp hoặc gợi ý thêm.


;;;--------------------------------------------------------------------
(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0 Le nil)
(repeat (sslength ss)
(setq
e (ssname ss i)
Le (append Le (list e))
i (1+ i)
)
)
Le
)
;;;--------------------------------------------------------------------
(defun getntv(sst p / Lt) ;;;Get Nearest Text Value in sst from p
(setq
Lt (ss2ent sst)
neap (lambda (x y)
(<
(distance p (cdr (assoc 10 (entget x))))
(distance p (cdr (assoc 10 (entget y))))
)
)
Lt (vl-sort Lt 'neap)
)
(cdr (assoc 1 (entget (car Lt))))
)
;;;--------------------------------------------------------------------
(defun C:UPH(/ e p t1 t2 t3 e1 e2 e3 d1 d2 d3) ;;;UPdate Height
(setq
e (car (entsel "\nSelect height block:")) ;;;Select block
p (cdr (assoc 10 (entget e))) ;;;Insert point of block
t1 (getntv (ssget "X" '((0 . "TEXT") (62 . 3))) p) ;;;Green text value nearest from p
t2 (getntv (ssget "X" '((0 . "TEXT") (62 . 1))) p) ;;;Red text value nearest from p
t3 (rtos (- (atof t2) (atof t1))) ;;;Subtract
e1 (entnext e) ;;;Attrib CD_TN entity
e2 (entnext e1) ;;;Attrib CD_TK entity
e3 (entnext e2) ;;;Attrib CH_CAO entity
d1 (entget e1) ;;;Get data1
d1 (subst (cons 1 t1) (assoc 1 d1) d1) ;;;Change data1
d2 (entget e2) ;;;Get data2
d2 (subst (cons 1 t2) (assoc 1 d2) d2) ;;;Change data2
d3 (entget e3) ;;;Get data3
d3 (subst (cons 1 t3) (assoc 1 d3) d3) ;;;Change data3
)
(entmod d1) ;;;Modify e1
(entmod d2) ;;;Modify e2
(entmod d3) ;;;Modify e3
(command "regen") ;;;Regenerating
(princ) ;;;Silent quit
)
;;;--------------------------------------------------------------------

Trước mắt mình cảm ơn ssg
Thực ra mình ý thức việc tự thực hiện các ý tưởng của của mình nhưng mà bí rồi mới nhờ anh em
Mình thấy có nhiều ông cứ tưởng diễn đàn này là nơi "làm từ thiện" nên có nhiều đòi hỏi thái quá
Thực ra đoạn yêu cầu trên là một phần trong việc lập cách giải quyết một vấn đề dài ngoằn nhưng mà mình không nêu ra vì những đoạn khác mình làm được . mình đang muốn học lisp mà
  • 0

#7 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 11 January 2008 - 03:27 PM

Trước mắt mình cảm ơn ssg
Thực ra mình ý thức việc tự thực hiện các ý tưởng của của mình nhưng mà bí rồi mới nhờ anh em
Mình thấy có nhiều ông cứ tưởng diễn đàn này là nơi "làm từ thiện" nên có nhiều đòi hỏi thái quá
Thực ra đoạn yêu cầu trên là một phần trong việc lập cách giải quyết một vấn đề dài ngoằn nhưng mà mình không nêu ra vì những đoạn khác mình làm được . mình đang muốn học lisp mà

rất tuyệt mình đã test rồi nhưng mà còn đoạn ngược lại ssg chỉ giúp luôn nhé
tức là lấy dữ liệu ra từ thuộc tính ví dụ khi chọn block thì nó sẽ ghi text thậm chí còn tính toán một chút rồi ghi ra (như là lấy chênh cao của block này cộng với chênh cao của block khác)
và lấy ra được toạ độ điểm chèn nữa chứ
  • 0

#8 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 11 January 2008 - 05:03 PM

rất tuyệt mình đã test rồi nhưng mà còn đoạn ngược lại ssg chỉ giúp luôn nhé
tức là lấy dữ liệu ra từ thuộc tính ví dụ khi chọn block thì nó sẽ ghi text thậm chí còn tính toán một chút rồi ghi ra (như là lấy chênh cao của block này cộng với chênh cao của block khác)
và lấy ra được toạ độ điểm chèn nữa chứ

Bạn hiểu được code của chương trình trên thì đương nhiên làm được "đoạn ngược lại". Bạn đang tập lập trình lisp, mình đề nghị lần này không làm thay mà chỉ gợi ý và hướng dẫn bạn tự làm. OK?
1) Trước tiên, bạn có thể cho mình biết: bạn hiểu về Entity và Selection Set, cũng như biết cách áp dụng chúng trong chương trình như thế nào? Xem như bài test để nắm được khái quát level của bạn, từ đó mình sẽ có gợi ý phù hợp.
2) Nếu chưa đọc, hãy tham khảo bài sau:
http://www.cadviet.c...?showtopic=1980
3) Trong chương trình trên:
e: Attribute Block
e1: Attrib CD_TN
e2: Attrib CD_TK
e3: Attrib CH_CAO
Tất cả chúng có kiểu là entity
Hàm entget lấy được toàn bộ data từ chúng
Hàm assoc, kết hợp với hàm cdr sẽ lấy ra được thông tin bất kỳ mà bạn muốn từ data trên
  • 0

#9 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 14 January 2008 - 03:54 PM

Bạn hiểu được code của chương trình trên thì đương nhiên làm được "đoạn ngược lại". Bạn đang tập lập trình lisp, mình đề nghị lần này không làm thay mà chỉ gợi ý và hướng dẫn bạn tự làm. OK?
1) Trước tiên, bạn có thể cho mình biết: bạn hiểu về Entity và Selection Set, cũng như biết cách áp dụng chúng trong chương trình như thế nào? Xem như bài test để nắm được khái quát level của bạn, từ đó mình sẽ có gợi ý phù hợp.
2) Nếu chưa đọc, hãy tham khảo bài sau:
http://www.cadviet.com/forum/index.php?showtopic=1980
3) Trong chương trình trên:
e: Attribute Block
e1: Attrib CD_TN
e2: Attrib CD_TK
e3: Attrib CH_CAO
Tất cả chúng có kiểu là entity
Hàm entget lấy được toàn bộ data từ chúng
Hàm assoc, kết hợp với hàm cdr sẽ lấy ra được thông tin bất kỳ mà bạn muốn từ data trên

Mình biết rồi. Tại sao ssg lại cho mình là 1 "lập trình viên". bên "nối điểm" mình đã giải thích rồi
1. mình tự học từ sách và không bài bản nên về lý thuyết thực ra "lơ mơ" chủ yếu vận dụng các ví dụ để lập thôi.
2. ban đầu khi học lisp mình nghĩ để tiết kiệm thời gian khi vẽ thôi (mình là KS XD DD - ĐHBK Đà Nẵng công tác được hơn 10 năm rồi, hồi mình đi học làm gì có máy để học thậm chí thuyết minh đồ án tốt nghiệp phải thuê người ta đánh). sau thì thấy vui vui nên nghiên cứu thêm nhưng tới khi bí thế là không biết hỏi ai, chán quá nghỉ.
3. nay vào diển đàn thấy anh em "tài quá" lại đam mê nghiên cứu tiếp
chính vì vậy về lý thuyết mình lơ mơ, nghiên cứu không sâu (thực ra do bí mà bỏ qua), quá trình thực hành thì khập khiển
nhưng dù sao cũng rất hấp dẫn
cám ơn cadviet, cam ơn ssg rất nhiều!
ssg đánh giá như vậy thật là oan cho anh em
  • 0

#10 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 15 January 2008 - 10:29 AM

Thông cảm với bạn vì attrib block là đối tượng phức tạp. Bạn mới làm quen với entity, lại chọn đúng cái phức tạp mà "chơi" nên lúng túng cũng phải!
Đoạn lisp sau lấy ra được các thuộc tính từ attrib block có tên "caodomoc" trong bản vẽ của bạn. Kết quả nhận được là:
p: toạ độ điểm chèn block, kiểu point (list có 3 thành phần)
CD_TN: cao độ hiện trạng, kiểu string
CD_TK: cao độ thiết kế, kiểu string
CH_CAO: độ chênh cao, kiểu string
Bạn có thể sử dụng chúng để làm gì tuỳ ý. Hàm alert cuối cùng chỉ là ví dụ, minh hoạ cho việc áp dụng các kết quả nhận được.


(defun C:GP() ;;;Get Properties
(setq
;;;Lay cac doi tuong trong attrib block
e (car (entsel "\nSelect attrib block:"))
e1 (entnext e)
e2 (entnext e1)
e3 (entnext e2)

;;;Lay toan bo data tu cac doi tuong tren
d (entget e)
d1 (entget e1)
d2 (entget e2)
d3 (entget e3)

;;;Lay ra cac gia tri can quan tam tu cac data
p (cdr (assoc 10 d))
CD_TN (cdr (assoc 1 d1))
CD_TK (cdr (assoc 1 d2))
CH_CAO (cdr (assoc 1 d3))
)

;;;Vi du minh hoa su dung cac gia tri nhan duoc
(alert
(strcat
"\nREPORT:"
"\n\tCao do hien trang: " CD_TN
"\n\tCao do thiet ke: " CD_TK
"\n\tDo chenh cao: " CH_CAO
"\n\tToa do diem chen block: " (rtos (car p)) "; " (rtos (cadr p)) "; " (rtos (caddr p))
)
)
)

  • 1

#11 dnhqs

dnhqs

    biết vẽ ellipse

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

Đã gửi 17 January 2008 - 10:51 AM

Thông cảm với bạn vì attrib block là đối tượng phức tạp. Bạn mới làm quen với entity, lại chọn đúng cái phức tạp mà "chơi" nên lúng túng cũng phải!
Đoạn lisp sau lấy ra được các thuộc tính từ attrib block có tên "caodomoc" trong bản vẽ của bạn. Kết quả nhận được là:
p: toạ độ điểm chèn block, kiểu point (list có 3 thành phần)
CD_TN: cao độ hiện trạng, kiểu string
CD_TK: cao độ thiết kế, kiểu string
CH_CAO: độ chênh cao, kiểu string
Bạn có thể sử dụng chúng để làm gì tuỳ ý. Hàm alert cuối cùng chỉ là ví dụ, minh hoạ cho việc áp dụng các kết quả nhận được.


(defun C:GP() ;;;Get Properties
(setq
;;;Lay cac doi tuong trong attrib block
e (car (entsel "\nSelect attrib block:"))
e1 (entnext e)
e2 (entnext e1)
e3 (entnext e2)

;;;Lay toan bo data tu cac doi tuong tren
d (entget e)
d1 (entget e1)
d2 (entget e2)
d3 (entget e3)

;;;Lay ra cac gia tri can quan tam tu cac data
p (cdr (assoc 10 d))
CD_TN (cdr (assoc 1 d1))
CD_TK (cdr (assoc 1 d2))
CH_CAO (cdr (assoc 1 d3))
)

;;;Vi du minh hoa su dung cac gia tri nhan duoc
(alert
(strcat
"\nREPORT:"
"\n\tCao do hien trang: " CD_TN
"\n\tCao do thiet ke: " CD_TK
"\n\tDo chenh cao: " CH_CAO
"\n\tToa do diem chen block: " (rtos (car p)) "; " (rtos (cadr p)) "; " (rtos (caddr p))
)
)
)

thực ra rất hấp dẫn, máy hôm nay đi công tác nên không online được
nhưng mình cũng lấy được thuộc tính rồi
bác xem thử nhé từ của bác nhưng mà mình làm theo kiểu "nhà quê:

;;;--------------------------------------------------------------------
(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0 Le nil)
(repeat (sslength ss)
(setq
e (ssname ss i)
Le (append Le (list e))
i (1+ i)
)
)
Le
)
;;;--------------------------------------------------------------------
(defun getntv(sst p / Lt) ;;;Get Nearest Text Value in sst from p
(setq
Lt (ss2ent sst)
neap (lambda (x y)
(<
(distance p (cdr (assoc 10 (entget x))))
(distance p (cdr (assoc 10 (entget y))))
)
)
Lt (vl-sort Lt 'neap)
)
(cdr (assoc 1 (entget (car Lt))))
)
;;;--------------------------------------------------------------------
(defun C:UPH(/ e p t1 t2 t3 e1 e2 e3 d1 d2 d3) ;;;UPdate Height
(setq
e (car (entsel "\nSelect height block:")) ;;;Select block
p (cdr (assoc 10 (entget e))) ;;;Insert point of block
t1 (getntv (ssget "X" '((0 . "TEXT") (62 . 3))) p) ;;;Green text value nearest from p
t2 (getntv (ssget "X" '((0 . "TEXT") (62 . 1))) p) ;;;Red text value nearest from p
t3 (rtos (- (atof t2) (atof t1)) 2 2) ;;;Subtract
;t3 (rtos caotrinh 2 2)
e1 (entnext e) ;;;Attrib CD_TN entity
e2 (entnext e1) ;;;Attrib CD_TK entity
e3 (entnext e2) ;;;Attrib CH_CAO entity

d1 (entget e1) ;;;Get data1
tt1 (assoc 1 d1)
d1 (subst (cons 1 t1) (assoc 1 d1) d1) ;;;Change data1
d2 (entget e2) ;;;Get data2
tt2 d2
d2 (subst (cons 1 t2) (assoc 1 d2) d2) ;;;Change data2
d3 (entget e3) ;;;Get data3
d3 (subst (cons 1 t3) (assoc 1 d3) d3) ;;;Change data3
)
(entmod d1) ;;;Modify e1
(entmod d2) ;;;Modify e2
(entmod d3) ;;;Modify e3
(command "regen") ;;;Regenerating
(princ tt1)
(princ "\n")
(princ (+ 1 (atof (cdr tt1))))
(setvar "CECOLOR" "cyan")
(command ".text" "s" "Standard" "j" "bl" p 0 (+ 1 (atof (cdr tt1))) ^C^C)

(princ) ;;;Silent quit
)
;;;--------------------------------------------------------------------
hì hì
  • 0

#12 npham

npham

    biết lệnh rotate

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

Đã gửi 09 September 2011 - 11:43 AM

pác hoanh và bac ssg đã trả lời rồi nhưng thực sự tôi vẫn thấy lơn mơ quá các pác có thể cho hẳn mình một đoạn code giải bài này rồi mình mới tiếp tục cuộc hành trình được: - có một loạt block trên bản vẽ (thuộc tính caodoht, caodotk, chenhcao) và một đôi text (màu xanh, màu đỏ chẵn hạn) - hô xung phong một pác lấy thằng text màu xanh gần nhất (điểm chèn block) gán cho caodoht, text màu đỏ cũng gần nhất cho caodotk; tính chenhcao=caotk-caodoht một đoạn khác: chọn vài block thôi các pác chỉ giup thế này cho dễ hiểu - chọn vài block có thuộc tính như nói trên : hô xung phong nữa thì sinh ra thằng text màu xanh màu đỏ tại điểm chèn chẵn hạn - với lại làm sao để mình bỏ cái block vào đây để các pạn dễ hình dung hoặc đoạn code của minh chẳn hạn hì hì cam ơn


Cho mền tham gia chút nhé.
Để làm được điều trên, có thể xây dựng các hàm sau:
-1 Hàm gán giá trị cho thuộc tính:
setatt (ent Tag value) : Trong đó ent: block, tag: thuộc tính cần gán, value: giá trị cần gán

-1 Hàm tìm text gần nhất block
textnear (ent ss) : Trong đó ent: block, ss: là tập hợp text

Sau khi xây dựng hai hàm này (cũng ngắn thôi) thì mọi việc sẽ đơn giản
Hàm chính:
Quét hết bock: ss = (ssget "X" '((0 . "INSERT")(2 . "CAODOMOC")))
Quét hết chữ xanh: ss1 = (ssget "X" '((0 . "TEXT") (62 . 3)))
Tương tự cho chữ đỏ: ss2 = (ssget "X" '((0 . "TEXT") (62 . 1)))

Sau đó :
cứ mỗi block trong ss, tìm trong ss1 cái nào gần block nhất (textnear bock ss1) thì gán cho "CD_TN" (setatt block "CD_TN" text)
tương tự tìm trong ss2 gán cho "CD_TK"
lấy hiệu gán cho CH_CAO

Các bác thấy ổn không?
  • 0

#13 npham

npham

    biết lệnh rotate

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

Đã gửi 09 September 2011 - 02:41 PM

À, mà theo mình mấy bác không nên sử dụng cách lấy thuộc tính bằng entnext và update bằng entmod. Cách này phải biết rõ bock có bao nhiêu att, và mỗi att có vị trí ở đâu.
Để tổng quát, các bác tham khảo code sau xem. đọan code này liệt kê ra tất cả att và value của nó.
Từ đây có thể triển khai ra các hàm khác để set, hoặc get att theo như ý muốn.


(defun getatt (ent / att atts obj)
(vl-load-com)
(setq obj (vlax-ename->vla-object ent))
(setq atts (safearray-value (variant-value (vla-getattributes obj))))

(foreach att atts
(princ (vlax-get att 'tagstring))
(princ ": ")
(princ (vlax-get att 'textstring))
(princ "\n")
)
)


Ví dụ: (getatt (car (entsel)))
  • 0