Đến nội dung


Hình ảnh
- - - - -

Nhờ Fix 2 Lisp đánh cao độ tự động và Lisp cộng thêm vào cao độ một giá trị


  • Please log in to reply
22 replies to this topic

#1 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 25 December 2009 - 01:26 PM

Mình muốn nhờ mọi người sửa giúp cho 2 cái lisp này fix nhau:
1. Lisp DetalH mình down từ diễn đàn là lisp cộng thêm vào các cốt một giá trị nhất định, với các cốt là Block thuộc tính.
2. Lisp đánh cao độ tự động với các cốt là Block thuộc tính hoạt động rất tốt.
Tuy nhiên 2 Lisp này lại không hỗ trợ lẫn nhau, nghĩa là: Mình đánh cốt bằng lisp đánh cốt tự động nhưng sau đó muốn cộng thêm các cốt đó một giá trị thì dùng lisp DeltaH thì không được.
Lisp DetalH: http://www.cadviet.c...s/2/deltalh.lsp
Lisp đánh cao độ tự động: http://www.cadviet.c...s/2/danhcot.rar
  • 0

#2 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 26 December 2009 - 12:13 AM

Mình muốn nhờ mọi người sửa giúp cho 2 cái lisp này fix nhau:
1. Lisp DetalH mình down từ diễn đàn là lisp cộng thêm vào các cốt một giá trị nhất định, với các cốt là Block thuộc tính.
2. Lisp đánh cao độ tự động với các cốt là Block thuộc tính hoạt động rất tốt.
Tuy nhiên 2 Lisp này lại không hỗ trợ lẫn nhau, nghĩa là: Mình đánh cốt bằng lisp đánh cốt tự động nhưng sau đó muốn cộng thêm các cốt đó một giá trị thì dùng lisp DeltaH thì không được.
Lisp DetalH: http://www.cadviet.c...s/2/deltalh.lsp
Lisp đánh cao độ tự động: http://www.cadviet.c...s/2/danhcot.rar

Chào bạn thanhlamct,
Trước hết bạn cần hiểu nội dung của lisp rồi sau đó mới nên áp dụng nó bạn ạ. Việc bạn chưa hiểu mà cứ áp dụng cầu may thì rất nguy hiểm, nhiều khi nó làm bạn điên cái đầu đó.
Hai cái lisp bạn gửi là được viết với các mục tiêu hoàn tòan độc lập. Do đó nó không tương thích với nhau là tất yếu.
Lisp cộng thêm giá trị vào cốt có sẵn chỉ sử dụng được với các bản vẽ có sử dụng việc đánh cốt bằng các block có chứa thuộc tính đầu tiên chính là cái cao độ cần thêm. Trong trường hợp cái block dùng để đánh cốt có chứa nhiều thuộc tính mà cái thuộc tính đầu tiên không phải là cao độ thì cái lisp này sẽ chạy sai ngay bạn ạ.
Cái lisp thứ hai được sử dụng để đánh cốt với cái block mang tên là dc50 mà nếu mình không nhầm thì thuộc tính chứa cao độ không phải là thuộc tính đầu tiên của block đó. Do vậy bạn không dùng với lisp thứ nhất được.

Nếu bạn muốn hai lisp này tương thích với nhau thì theo mình bạn có thể phải tạo lại cái block dc50 này sao cho nó thỏa mãn điều kiện trên.
Trong trường hợp bạn không tự làm được thì hãy post một file bản vẽ mà bạn đã ứng dụng lisp thứ hai để đánh cốt đồng thời với cái block dc50 này để mình tham khảo. Từ đó mới có thể giúp bạn được bạn ạ.

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

#3 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 26 December 2009 - 09:58 AM

Hai cái lisp bạn gửi là được viết với các mục tiêu hoàn tòan độc lập.


Mình biết điều này bác phamthanhbinh ạ.
Nhờ bác sửa dùm với. Đây là file em sử dụng 2 lisp:
http://www.cadviet.c.../2/suablock.dwg
  • 0

#4 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 26 December 2009 - 03:14 PM

Mình biết điều này bác phamthanhbinh ạ.
Nhờ bác sửa dùm với. Đây là file em sử dụng 2 lisp:
http://www.cadviet.c.../2/suablock.dwg

Chào bạn thanhlamct,
Mình đã sửa cái lisp deltalh để bạn sử dụng với cái lisp đánh cốt sử dụng block dc50, tuy nhiên bạn phải lưu ý rằng lisp deltalh bây giờ sẽ không dùng được với các bản vẽ mà trước đây bạn đã sử dụng lisp deltalh để điều chỉnh cao độ cốt.
Vậy nên mình khuyên bạn nên lưu lisp này với tên khác lisp deltalh cũ chẳng hạn deltalh-1.lsp để bạn có thể tùy cơ mà ứng biến.
Do mình không có chuyên môn về ngành xây dựng, cầu đường, trắc đạc,...... nên không dám sửa giúp bạn cái block dc50 (vì sợ nó ảnh hưởng đến công việc của bạn) mà đành sửa cái lisp deltalh để bạn xài vậy.
Tuy nhiên mình nghĩ rằng cách tốt nhất vẫn là bạn hãy tạo lại cái block dc50 này sao cho nó có thuộc tính thứ nhất là giá trị của cốt, như vậy sẽ thuận lợi hơn cho công việc của bạn.
Chúc bạn thành công.
Đây là lisp deltalh đã sửa:

(defun c:deh ()
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun addstring (str so)
(rtos (+ (atof str) so) 2 2)
)
(defun addone (ent / tt)
(setq ent (entnext (entnext ent)))
(setq tt (entget ent)
old (assoc 1 tt)
new (cons 1 (addstring (cdr old) deltah))
tt (subst new old tt)
)
(entmod tt)
(entupd ent)
)
(setq ss (ssget '((0 . "INSERT") (66 . 1)))
deltah (getreal "\nVao gia tri chenh: ")
)
(sudung addone ss)
(princ)
)


PS: việc bạn sử dụng block dc50 với hai thuộc tính có cùng tag là # là tự bạn làm khó cho mình khi muốn nhận dạng các thuộc tính này. Theo mình khi dùng block với nhiều thuộc tính thì nên cố gắng dùng các tag khác nhau cho mỗi một thuộc tính. Như vậy khi muốn nhận dạng thuộc tính, chỉ cần dựa vào các tag này là dễ dàng phân biệt được bạn ạ.
Các tag của thuộc tính được quy định bởi mã DXF số 2 của thuộc tính đó. Bạn hãy lưu ý điều này.
Cụ thể nếu như cái block dc50 của bạn có thuộc tính giá trị cốt với tag khác với # thì mình có thể tạo được một lisp sử dụng chung cho tất cả các trường hợp đánh cốt với điều kiện các block dùng để đánh cốt có thuộc tính giá trị code với cùng một tag. (ví dụ tag là GIATRI chẳng hạn).
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 26 December 2009 - 03:36 PM

Trước tiên rất cảm ơn bác đã giúp đỡ. Mình đã test thử và gặp vấn đề bất cập sau:
- Dấu của các cốt không bị thay đổi.
Thuộc tính thứ nhất của Block DC50 chính là dấu của cốt.
Ví dụ: cốt -5m, mình dùng cốt DeltaH cộng thêm 10m nứa thì được cốt -15m, lẽ ra phải là +5m.
Nếu trừ đi -10m thì được - - 5m, lẽ ra phải là -15m.
Mong bác giúp!
  • 0

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 December 2009 - 03:42 PM

Chào bạn thanhlamct,
Mình đã sửa cái lisp deltalh để bạn sử dụng với cái lisp đánh cốt sử dụng block dc50, tuy nhiên bạn phải lưu ý rằng lisp deltalh bây giờ sẽ không dùng được với các bản vẽ mà trước đây bạn đã sử dụng lisp deltalh để điều chỉnh cao độ cốt.
Vậy nên mình khuyên bạn nên lưu lisp này với tên khác lisp deltalh cũ chẳng hạn deltalh-1.lsp để bạn có thể tùy cơ mà ứng biến.
Do mình không có chuyên môn về ngành xây dựng, cầu đường, trắc đạc,...... nên không dám sửa giúp bạn cái block dc50 (vì sợ nó ảnh hưởng đến công việc của bạn) mà đành sửa cái lisp deltalh để bạn xài vậy.
Tuy nhiên mình nghĩ rằng cách tốt nhất vẫn là bạn hãy tạo lại cái block dc50 này sao cho nó có thuộc tính thứ nhất là giá trị của cốt, như vậy sẽ thuận lợi hơn cho công việc của bạn.
Chúc bạn thành công.
Đây là lisp deltalh đã sửa:


(defun c:deh ()
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun addstring (str so)
(rtos (+ (atof str) so) 2 2)
)
(defun addone (ent / tt)
(setq ent (entnext (entnext ent)))
(setq tt (entget ent)
old (assoc 1 tt)
new (cons 1 (addstring (cdr old) deltah))
tt (subst new old tt)
)
(entmod tt)
(entupd ent)
)
(setq ss (ssget '((0 . "INSERT") (66 . 1)))
deltah (getreal "\nVao gia tri chenh: ")
)
(sudung addone ss)
(princ)
)

Chào bác PhamthanhBinh cùng bạn thanhlam
Lisp deh phải sử dụng đúng cho cả 2 trường hợp. Trong Lisp của bác PhamthanhBinh chỉ sđúng cho 1 trường hợp mà thôi, Để sử dụng lisp deh đúng cho cả 2 trường hợp thì theo ý kiến của Tue_NV như thế này :
1. Ta biết rằng giá trị thuộc tính gồm 1 Tagname và 1 Tagval. Ta hãy để ý đến TagName. Khi TagName của cao độ giống nhau của 2 trường hợp giống nhau sẽ áp đụng đúng cho cả 2 trường hợp. Ở tại Tagame này lấy ra Tagval và sử dụng phép tính của nó.
Bác PhamthanhBinh hoàn thành code này theo cách của Tue_NV thử xem.

Vài lời góp ý. Hy vọng Code được xây dựng thành công.
  • 2

#7 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 26 December 2009 - 04:14 PM

Khi TagName của cao độ giống nhau của 2 trường hợp giống nhau sẽ áp đụng đúng cho cả 2 trường hợp.

Em đã thử cho TagName của 2 Block giống nhau nhưng vẫn không được. Em nghĩ rằng vấn đề là ở dấu Block DC50 là 1 thuộc tính riêng, không nằm trong giá trị của Value. Chắc có lẽ phải sửa trong Lisp đánh cốt tự động.
  • 0

#8 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 26 December 2009 - 04:32 PM

mình có thể tạo được một lisp sử dụng chung cho tất cả các trường hợp đánh cốt với điều kiện các block dùng để đánh cốt có thuộc tính giá trị code với cùng một tag. (ví dụ tag là GIATRI chẳng hạn).

Bác có thể tạo tùy ý Block miễn là chúng sử dụng chung được với nhau.
PS: Sở dĩ mình gặp vấn đề này là vì khi chưa có cốt san nền của công trình thì quy định cốt san nền là cốt 0.00. Khi đã có cốt san nền thì phải cộng thêm hoặc trừ đi 1 giá trị, không phải đánh lại cốt bằng lisp.
  • 0

#9 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 26 December 2009 - 04:46 PM

Trước tiên rất cảm ơn bác đã giúp đỡ. Mình đã test thử và gặp vấn đề bất cập sau:
- Dấu của các cốt không bị thay đổi.
Thuộc tính thứ nhất của Block DC50 chính là dấu của cốt.
Ví dụ: cốt -5m, mình dùng cốt DeltaH cộng thêm 10m nứa thì được cốt -15m, lẽ ra phải là +5m.
Nếu trừ đi -10m thì được - - 5m, lẽ ra phải là -15m.
Mong bác giúp!

Xin lỗi bạn thanhlamct,
Vì mình không chú ý tới các cốt âm ( trên bản vẽ bạn gửi toàn là cốt dương) nên cái lisp mình sửa bị lỗi. Rất mong bạn bỏ quá cho sự dốt nghề của mình.
Đây là cái mình đã sửa lại để nó chạy đúng với cả cốt âm.

(defun c:deh ()
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun addstring (str so)
(rtos (+ (atof str) so) 2 2)
)
(defun addone (ent / tt)
(if (= (cdr (assoc 1 (entget (entnext ent)))) "-")
(progn
(setq ent (entnext (entnext ent)))
(setq tt (entget ent)
old (assoc 1 tt)
new (cons 1 (substr (addstring (strcat "-" (cdr old)) deltah) 2))
tt (subst new old tt)
)
(entmod tt)
(entupd ent)
)
(progn
(setq ent (entnext (entnext ent)))
(setq tt (entget ent)
old (assoc 1 tt)
new (cons 1 (addstring (cdr old) deltah))
tt (subst new old tt)
)
(entmod tt)
(entupd ent)
)
)
)
(setq ss (ssget '((0 . "INSERT") (66 . 1)))
deltah (getreal "\nVao gia tri chenh: ")
)
(sudung addone ss)
(princ)
)


@Bác Tue_NV: Mình cũng đã nghĩ đến điều bác nói , song rất tiếc là cái block dc50 của bạn thanhlamct có tới hai thuộc tính có trùng tag với nhau nên khó phân biệt quá, đành làm cấp kỳ cho bạn ấy có cái xài đã bác ạ. Mong bác đọc lại phần edit của bài mình post lần trước sẽ hiểu và có giải pháp khác giúp bạn thanhlamct bác nhé.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#10 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 26 December 2009 - 04:59 PM

Vẫn bị lỗi bác ạ:
- Khi chuyển từ cốt âm sang cốt dương hoăc ngược lại bị lỗi.
Ví dụ: Cốt -5.00m cộng thêm +10m được cốt -0.00m
Cốt +5.00m trừ đi -10m được cốt +-5.00m
  • 0

#11 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 26 December 2009 - 05:00 PM

Em đã thử cho TagName của 2 Block giống nhau nhưng vẫn không được. Em nghĩ rằng vấn đề là ở dấu Block DC50 là 1 thuộc tính riêng, không nằm trong giá trị của Value. Chắc có lẽ phải sửa trong Lisp đánh cốt tự động.

Chào bạn Thanhlamct,
Bạn hiểu sai ý bác Tue_NV rồi, ý bác ấy là cái tagname của thuộc tính chớ không phải của block bạn ạ. Bạn đọc lại phần edit của mình ở bài post trước sẽ rõ.
Vấn đề của bạn ở đây là cái block dc50 được mặc định sẽ nhập trong cái lisp đánh cốt, mà mình chả biết tạo cái block dc50 này như thế nào. Còn việc tạo block mới để đánh cốt thì mình chả hiểu lắm về chuyên môn của bạn nên chả biết cái block này cần có những thông tin gì. Vì thế nên mình chả tạo block mới được và cứ xài các block có sẵn trên bản vẽ của bạn post mà thôi. Chỉnh sửa nó mình e rằng nó làm hư các bản vẽ của bạn do thói quen sử dụng sẵn có của bạn mà thôi.
Về việc tạo block đánh cốt này có lẽ bạn tham khảo thêm ý kiến của các bác cùng chuyên môn với bạn như Tue_NV, Nataca, ...... để có thể tạo được các block theo ý của bạn.
Mong bạn hiểu và thông cảm với dân me cha ni cô như mình.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#12 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 26 December 2009 - 06:03 PM

Em nghĩ rằng vấn đề là ở dấu Block DC50 là 1 thuộc tính riêng, không nằm trong giá trị của Value.


  • 0

#13 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 26 December 2009 - 06:06 PM

Vẫn bị lỗi bác ạ:
- Khi chuyển từ cốt âm sang cốt dương hoăc ngược lại bị lỗi.
Ví dụ: Cốt -5.00m cộng thêm +10m được cốt -0.00m
Cốt +5.00m trừ đi -10m được cốt +-5.00m

Hề hề hề,
Vấn đề của bạn vậy mà không đơn giản tẹo nào. Cái chết của nó chính là cái thuộc tính dấu này. Mình đang bí ở đây vì vấn đề là nếu chỉ chỉnh sửa một lần thì không sao nhưng nếu sau khi chỉnh sửa bạn lại muốn chỉnh tiếp nửa thì hơi gay go, khi đó có thể nó mất biến cả cái dấu này đi bạn ạ. Bạn chịu khó chờ để mình nghĩ thêm và tìm giải pháp đã 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.

#14 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 26 December 2009 - 07:08 PM

Vẫn bị lỗi bác ạ:
- Khi chuyển từ cốt âm sang cốt dương hoăc ngược lại bị lỗi.
Ví dụ: Cốt -5.00m cộng thêm +10m được cốt -0.00m
Cốt +5.00m trừ đi -10m được cốt +-5.00m

Chào bạn thanhlamct,
Ha ha ha, ta mò ra rồi. Bạn thử cái củ này xem đã ổn chưa nhé, có còn giắt răng không??? Nghĩ mãi, mình phải tách cái thuộc tính dấu ra để xử lý riêng theo kết quả của việc tính toán mới thấy có vẻ ngon ngon. Nó đây nè:

(defun c:deh ()
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun addstring (str so)
(rtos (+ (atof str) so) 2 2)
)
(defun addone (ent / tt)
(setq elst (entget (entnext ent)))
(setq ent (entnext (entnext ent)))
(setq tt (entget ent)
old (assoc 1 tt))
(if (= (cdr (assoc 1 elst)) "-")
(setq txt (addstring (strcat "-" (cdr old)) deltah))
(setq txt (addstring (cdr old) deltah))
)
(if (= (substr txt 1 1) "-")
(progn
(setq txt (substr txt 2)
elst (subst (cons 1 "-") (assoc 1 elst) elst)
)
)
(setq elst (subst (cons 1 "+") (assoc 1 elst) elst))
)
(entmod elst)
(setq new (cons 1 txt)
tt (subst new old tt)
)
(entmod tt)
(entupd ent)
)
(setq ss (ssget '((0 . "INSERT") (66 . 1)))
deltah (getreal "\nVao gia tri chenh: ")
)
(sudung addone ss)
(princ)
)

Bạn cứ thử thoải mái , cộng trừ liên tiếp vào cả cốt âm lẫn dương xem nó có chửi lại không nhé. Mình thử sơ sơ thấy nó chịu xếp càng rồi bạn ạ. Nhớ là phải thử với các cốt đánh bằng block dc50 nhé.

PS: À nó còn tí xơ là với các cốt bằng 0.00 sau khi tính toán thì nó chỉ oánh dấu cộng mà không phải là dấu +/- bạ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.

#15 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 27 December 2009 - 06:01 AM

PS: việc bạn sử dụng block dc50 với hai thuộc tính có cùng tag là # là tự bạn làm khó cho mình khi muốn nhận dạng các thuộc tính này. Theo mình khi dùng block với nhiều thuộc tính thì nên cố gắng dùng các tag khác nhau cho mỗi một thuộc tính. Như vậy khi muốn nhận dạng thuộc tính, chỉ cần dựa vào các tag này là dễ dàng phân biệt được bạn ạ.
Các tag của thuộc tính được quy định bởi mã DXF số 2 của thuộc tính đó. Bạn hãy lưu ý điều này.
Cụ thể nếu như cái block dc50 của bạn có thuộc tính giá trị cốt với tag khác với # thì mình có thể tạo được một lisp sử dụng chung cho tất cả các trường hợp đánh cốt với điều kiện các block dùng để đánh cốt có thuộc tính giá trị code với cùng một tag. (ví dụ tag là GIATRI chẳng hạn).

Chào bác PhamThanhBinh cùng bạn thanhlam.
Tue_NV đồng ý với ý kiến của bác PhamThanhBinh và có thêm 1 số ý kiến sau :
Bác PhamThanhBinh : Khi đã "lỡ" chèn Block thuộc tính với 2 Tagname là dấu # và dấu # thì bác cũng có thể sửa lại Tagname cho Block dc50 cơ mà. Ví dụ Tagname đầu là AMDUONG, Tagame thứ 2 là GIATRI và Tag name của Block Textcaodo cũng là GIATRI và Lisp đúng cho mọi trường hợp như bác ThanhBinh nói là "đánh cốt có thuộc tính giá trị với cùng một tag"


@thanhlamct : Bạn có thể upload file bạn đã sửa Tângme lên đây được không?

Em đã thử cho TagName của 2 Block giống nhau nhưng vẫn không được. Em nghĩ rằng vấn đề là ở dấu Block DC50 là 1 thuộc tính riêng, không nằm trong giá trị của Value. Chắc có lẽ phải sửa trong Lisp đánh cốt tự động.


  • 0

#16 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 28 December 2009 - 10:21 AM

Cảm ơn bác Phamthanhbinh. Em vừa test thử xong thấy ổn áp lắm, chỉ có điều không sử dụng cho các Block thuộc tính khác. Nhưng như thế cũng là tuyệt lắm rồi.
@ bác Tue_NV: Em sửa Block như the này nhưng có vẻ không ổn: http://www.cadviet.c.../suablock_1.dwg
  • 0

#17 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 28 December 2009 - 01:22 PM

Cảm ơn bác Phamthanhbinh. Em vừa test thử xong thấy ổn áp lắm, chỉ có điều không sử dụng cho các Block thuộc tính khác. Nhưng như thế cũng là tuyệt lắm rồi.
@ bác Tue_NV: Em sửa Block như the này nhưng có vẻ không ổn: http://www.cadviet.c.../suablock_1.dwg

Chào bạn thanhlamct,
Gửi bạn cái lisp này, có thể chạy được với cả hai loại block mà bạn đã chỉnh sửa là textcaodo và dc501. Với các block cao độ khác mình không chắc chắn lắm vì đôi khi chúng có những thuộc tính khác với hai bock trên. Để thuận lợi cho việc hiệu chỉnh sau này bạn nên sử dụng các block đánh cốt với cùng các thuộc tính như môtt trong hai block nói trên nhé. Đặc biệt lưu ý là cái thuộc tính giá trị cao độ phải có tagname là GIATRI bạn nhé.

(defun c:deh ()
(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)
(defun addstring (str so)
(rtos (+ (atof str) so) 2 2)
)
(defun addone (ent / tt)
(setq elst (entget(entnext ent)))
(while (/= (cdr (assoc 2 (entget ent))) "GIATRI")
(setq ent (entnext ent))
)
(setq tt (entget ent)
old (assoc 1 tt))
(If (= (cdr(assoc 2 elst)) "AMDUONG")
(Progn
(if (= (cdr (assoc 1 elst)) "-")
(setq txt (strcat "-" (cdr old)))
(setq txt (cdr old))
)
(if (= (substr (addstring txt deltah) 1 1) "-")
(progn
(setq elst (subst (cons 1 "-") (assoc 1 elst) elst)
txt (substr (addstring txt deltah) 2))
)
(progn
(setq elst (subst (cons 1 "+") (assoc 1 elst) elst)
txt (addstring txt deltah))
)
)
(entmod elst)
(setq new (cons 1 txt)
tt (subst new old tt))
)
(progn
(setq new (cons 1 (addstring (cdr old) deltah))
tt (subst new old tt))
)
)
(entmod tt)
(entupd ent)
)
(setq ss (ssget '((0 . "INSERT") (66 . 1)))
deltah (getreal "\nVao gia tri chenh: ")
)
(sudung addone ss)
(princ)
)

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.

#18 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 28 December 2009 - 03:12 PM

Mình biết điều này bác phamthanhbinh ạ.
Nhờ bác sửa dùm với. Đây là file em sử dụng 2 lisp:
http://www.cadviet.c.../2/suablock.dwg

Chào bạn thanhlamct,
Gửi bạn cái lisp này, có thể chạy được với cả hai loại block là : text-caododc50
Chú ý : Đơn vị Gia tri chenh caomilimét.
(defun c:deh(/ lstAtt caodo dau deltah find)
(vl-load-com)
(if (and
(ssget '((0 . "INSERT") (66 . 1) (2 . "dc50,text-caodo") ))
(setq deltah (getdist "\nGia tri chenh cao (mm) : "))
(setq deltah (/ deltah 1000.)) )
(vlax-for blk (vla-get-activeSelectionSet (vla-get-activedocument(vlax-get-acad-object)))
(setq lstAtt
(mapcar
(function
(lambda (x)
(cons (strcase (vla-get-TagString x)) (vla-get-TextString x))))
(vlax-invoke blk 'GetAttributes)))
(if (and (=(length lstAtt)1) (numberp (read (cdr (car lstAtt)))))
(foreach att (vlax-invoke blk 'GetAttributes)
(if (setq find (assoc (vla-get-tagstring att) lstAtt))
(vla-put-textstring att (rtos (+ (atof (cdr find)) deltah) 2 3)))
(vla-update att)
)
(progn ;(>(length lstAtt)1)
(setq lstAtt (vl-sort lstAtt '(lambda (x y) (< (cdr x) (cdr y) )))
dau (cdr (car lstAtt))
caodo (cdr (cadr lstAtt)))
(if (and (wcmatch dau "+,-,%%p")
(numberp (read caodo )) )
(progn
(if (= dau "-")
(setq caodo (+ (* -1 (atof caodo)) deltah ))
(setq caodo (+ (atof caodo) deltah )))
(cond
((= caodo 0) (setq dau "%%p" ))
((> caodo 0) (setq dau "+" ))
((< caodo 0) (setq caodo (abs caodo ) dau "-" )) )
(foreach att (vlax-invoke blk 'GetAttributes)
(if (setq find (assoc (vla-get-tagstring att) lstAtt))
(progn
(if(numberp (read (cdr find) ))
(vla-put-textstring att (rtos caodo 2 3))
(vla-put-textstring att dau) )
(setq lstAtt (vl-remove find lstAtt))
)
)
(vla-update att)
)
)
)
)
)
)
)
(princ)
)

  • 2

#19 thanhlamct

thanhlamct

    biết lệnh offset

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

Đã gửi 28 December 2009 - 05:22 PM

Tuyệt quá, nhưng sao

Chú ý : Đơn vị Gia tri chenh caomilimét.

Em chỉ sửa dòng
(setq deltah (/ deltah 1000.)) ) thành (setq deltah (/ deltah 1.)) )
là chạy được cho đơn vị là m mà.
PS: Sao nick của bác gia_bach không có nút thanks nhỉ?
Hình đã gửi
  • 0

#20 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 29 December 2009 - 11:29 AM

Tuyệt quá, nhưng sao

Em chỉ sửa dòng
(setq deltah (/ deltah 1000.)) ) thành (setq deltah (/ deltah 1.)) )
là chạy được cho đơn vị là m mà.
PS: Sao nick của bác gia_bach không có nút thanks nhỉ?
Hình đã gửi

Bạn có thể sửa cho phù hợp với công việc của ban.
nút thanks chỉ đuợc click 1 lần. (trên hình bạn đã click rùi )
lần sau nhớ để dành nha. :(
  • 0