Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.

Các bài được khuyến nghị

Mong các anh giúp em chỉnh sửa file này. Đây là file cao độ hiện trạng, nhưng các số thập phân của cao độ đều bị tách rời thành 2 text khác nhau. Các anh có thể giúp em nhập lại thành 1 giá trị text được không? Ví dụ: 2 21 thành 2.21

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mong các anh giúp em chỉnh sửa file này. Đây là file cao độ hiện trạng, nhưng các số thập phân của cao độ đều bị tách rời thành 2 text khác nhau. Các anh có thể giúp em nhập lại thành 1 giá trị text được không? Ví dụ: 2 21 thành 2.21

http://www.cadviet.com/upfiles/xr_caodo.dwg

Theo hiểu biết của mình thì giữa 2 text này còn 1 đối tượng point hoặc circle nửa bạn đưa cả nó lên thì mình nối lại cho bạn. Nhưng về bạn phải ngồi tự kiểm tra lổi nhé.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mong các anh giúp em chỉnh sửa file này. Đây là file cao độ hiện trạng, nhưng các số thập phân của cao độ đều bị tách rời thành 2 text khác nhau. Các anh có thể giúp em nhập lại thành 1 giá trị text được không? Ví dụ: 2 21 thành 2.21

http://www.cadviet.com/upfiles/xr_caodo.dwg

Bạn sử dụng Lisp này xem.

Lisp yêu cầu :

Chọn Text 1

Chọn Text 2

Sau đó nối theo yêu cầu của bạn

(defun c:n2t()
(setq te1 (car(entsel "\n Chon text 1 :")))
(setq te2 (car(entsel "\n Chon text 2 :")))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss1)))
(setq hei (cdr(assoc 40 ss1)))

(Command "style" st "" "0" "" "" "n" "n")
(Command "text" po hei "0" (strcat nd1 "." nd2))
(command "erase" te1 "")
(command "erase" te2 "")
(Princ)
)

Chúc bạn thành công :undecided:

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn sử dụng Lisp này xem.

Lisp yêu cầu :

Chọn Text 1

Chọn Text 2

Sau đó nối theo yêu cầu của bạn

(defun c:n2t()
(setq te1 (car(entsel "\n Chon text 1 :")))
(setq te2 (car(entsel "\n Chon text 2 :")))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss1)))
(setq hei (cdr(assoc 40 ss1)))

(Command "style" st "" "0" "" "" "n" "n")
(Command "text" po hei "0" (strcat nd1 "." nd2))
(command "erase" te1 "")
(command "erase" te2 "")
(Princ)
)

Chúc bạn thành công :undecided:

to Duy: em đưa tòan bộ file rồi đó anh

to Tue: cảm ơn bạn đã giúp, nhưng nhiều text quá mình phải chọn từng cái thì lâu quá.

Có cách nào làm nhanh hơn ko ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
to Duy: em ðýa tòan bộ file rồi ðó anh

to Tue: cảm õn bạn ðã giúp, nhýng nhiều text quá mình phải chọn từng cái thì lâu quá.

Có cách nào làm nhanh hõn ko ?

Tôi có ý kiến thế này.

Bạn thấy tẽt trên có hai loại. Loại ðịnh vị R và loại dịnh vị L và chúng có cùng tung ðộ và hoành ðộ cách nhau 0.8m

Trýớc hết bạn chọn tất cả tẽt ðịnh vi R, dời chúng ðoạn x=0.8 (lúc này loại loại tẽt này ðã cùng tọa ðộ theo từng cặp týõng ứng của chúng).

Sau ðó chọn lại chúng lần nữa, lập vòng lặp ði qua từng ðối týợng tẽt và lập danh sách có dạng ds1 = ((toado1 ename1) (toado2 ename2) ... (toadoN enameN)).

Tiếp theo bạn chọn tất cả tẽt ðịnh vị L. lập vòng lặp ði qua từng ðối týợng tẽt. mỗi lần nhý vậy bạn lấy tọa ðộ pI và text (L) của chúng. dùng hàm (assoc pI ds1) bạn sẽ ðýợc (toadoI nameI), từ nameI bạn sẽ ðýợc text ®, công việc tiếp theo thì khá ðõn giản rồi.

Ghi chú : Tôi không rành vl lắm nên có những hàm vl ðã có.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
to Duy: em đưa tòan bộ file rồi đó anh

to Tue: cảm ơn bạn đã giúp, nhưng nhiều text quá mình phải chọn từng cái thì lâu quá.

Có cách nào làm nhanh hơn ko ?

Chào bạn thangkho,

Bạn thử cái líp này xem có được không. Lisp này mình dựa trên lisp của bác Tue_NV và dựa trên suy luận rằng hai con số của bạn phải được nhập liên tiếp nhau vì nó thể hiện cao độ của điểm nhập. Nhưng do trên bản vẽ của bạn có những text không phải là các con số như vậy nên mình yêu cầu khi chạy lisp bạn phải chọn các đối tượng bằng cửa sổ qua hai điểm của đường chéo hình chữ nhật mà bạn sẽ nhập vào. Điều này giúp bạn loại bỏ các chữ không cần nối mà chỉ chọn các đối tượng là các cặp số cần nối thôi. Như vậy bạn có thể chọn một lần nhiều cặp số như vậy miễn là cái cửa sổ của bạn phải chứa toàn các cặp số định nối mà không có thêm bất cứ đối tượng ngoại lai nào. Tuy lisp này chưa hẳn đã đúng ý bạn nhưng nó có thể giúp bạn giảm bớt số lần chạy lisp để có thể hoàn thành toàn bộ các cặp số cần nối của bạn.

(defun c:n2t()
(setq ss (ssget "w" (getpoint "\n Chon diem thu nhat") 

(getpoint "\n chon diem thu hai"))
  n (sslength ss)
  i 0
)
(While ((setq te1 (ssname ss i))
(setq te2 (ssname ss (1+ i)))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss2)))
(setq hei (cdr(assoc 40 ss1)))

(Command "style" st "" "0" "" "" "n" "n")
(Command "text" po hei "0" (strcat nd2 "." nd1))
(command "erase" te1 "")
(command "erase" te2 "")
(setq i (+ i 2))
)
(Princ)
)

 

Để tăng hiệu quả của lisp này bạn có thể đổi các text ngoại lai sang lớp khác với lớp của các cặp số cần nối (hiện tại nó là lớp "nen") và bổ sung một filter list '(8. "nen") vào trong hàm SSget là bạn sẽ có thể chơi một lần toàn bộ các cặp số có trên bản vẽ hiện hành của bạn.

 

Chúc bạn thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
to Duy: em đưa tòan bộ file rồi đó anh

Nếu đây là toàn bộ file của bạn thì phần còn lại chắc chắn phải ở đâu đó (từ người giao file cho bạn chẳng hạn). Đối với file của bạn thì như tdvn đã phân tích là có thể làm được nhưng ngại vì trường hợp này không điển hình lắm. Mình nghỉ tốt nhất bạn tìm phần còn lại của file xem vì không thể có 1 file trụi lủi như vậy được.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn thangkho,

Bạn thử cái líp này xem có được không. Lisp này mình dựa trên lisp của bác Tue_NV và dựa trên suy luận rằng hai con số của bạn phải được nhập liên tiếp nhau vì nó thể hiện cao độ của điểm nhập. Nhưng do trên bản vẽ của bạn có những text không phải là các con số như vậy nên mình yêu cầu khi chạy lisp bạn phải chọn các đối tượng bằng cửa sổ qua hai điểm của đường chéo hình chữ nhật mà bạn sẽ nhập vào. Điều này giúp bạn loại bỏ các chữ không cần nối mà chỉ chọn các đối tượng là các cặp số cần nối thôi. Như vậy bạn có thể chọn một lần nhiều cặp số như vậy miễn là cái cửa sổ của bạn phải chứa toàn các cặp số định nối mà không có thêm bất cứ đối tượng ngoại lai nào. Tuy lisp này chưa hẳn đã đúng ý bạn nhưng nó có thể giúp bạn giảm bớt số lần chạy lisp để có thể hoàn thành toàn bộ các cặp số cần nối của bạn.

(defun c:n2t()
(setq ss (ssget "w" (getpoint "\n Chon diem thu nhat") 

(getpoint "\n chon diem thu hai"))
  n (sslength ss)
  i 0
)
(While ((setq te1 (ssname ss i))
(setq te2 (ssname ss (1+ i)))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss2)))
(setq hei (cdr(assoc 40 ss1)))

(Command "style" st "" "0" "" "" "n" "n")
(Command "text" po hei "0" (strcat nd2 "." nd1))
(command "erase" te1 "")
(command "erase" te2 "")
(setq i (+ i 2))
)
(Princ)
)

 

Để tăng hiệu quả của lisp này bạn có thể đổi các text ngoại lai sang lớp khác với lớp của các cặp số cần nối (hiện tại nó là lớp "nen") và bổ sung một filter list '(8. "nen") vào trong hàm SSget là bạn sẽ có thể chơi một lần toàn bộ các cặp số có trên bản vẽ hiện hành của bạn.

 

Chúc bạn thành công.

Không đúng bác Bình ạ. Có lẽ do hàm ssget khi chạy nó chọn đối tượng không tuân theo quy luật như bác nghĩ.

Để kiểm tra lại kết quả file Lisp, bác cứ sử dụng File Lisp của bạn thangkho copy các số đó sang chổ khác. Sau chạy File Lisp bác hãy đối chiếu lại các con số sau khi chạy Lisp và các con số mà bạn thangkho yêu cầu nối mà xem. Nó không đúng.

Có lẽ mình nên chuyển theo hướng nghĩ của bác tdvn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
(setq ss (ssget "w" (getpoint "\n Chon diem thu nhat")

 

(getpoint "\n chon diem thu hai"))

n (sslength ss)

i 0

)

Mạn phép góp ý bác Bình tí mong bác không giận!

Bác bắt buộc chọn 2 điểm xong là lấy tập hợp chọn luôn là không hay, Bác cứ dùng ssget khi nào người dùng chọn xong thì enter để hoàn tất quá trình chọn. Và bác cũng nên cho điều kiện lọc text vào để lở có lộn đối tượng khác vào thì nó bỏ ra.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi có ý kiến thế này.

Bạn thấy tẽt trên có hai loại. Loại ðịnh vị R và loại dịnh vị L và chúng có cùng tung ðộ và hoành ðộ cách nhau 0.8m

Trýớc hết bạn chọn tất cả tẽt ðịnh vi R, dời chúng ðoạn x=0.8 (lúc này loại loại tẽt này ðã cùng tọa ðộ theo từng cặp týõng ứng của chúng).

Sau ðó chọn lại chúng lần nữa, lập vòng lặp ði qua từng ðối týợng tẽt và lập danh sách có dạng ds1 = ((toado1 ename1) (toado2 ename2) ... (toadoN enameN)).

Tiếp theo bạn chọn tất cả tẽt ðịnh vị L. lập vòng lặp ði qua từng ðối týợng tẽt. mỗi lần nhý vậy bạn lấy tọa ðộ pI và text (L) của chúng. dùng hàm (assoc pI ds1) bạn sẽ ðýợc (toadoI nameI), từ nameI bạn sẽ ðýợc text ®, công việc tiếp theo thì khá ðõn giản rồi.

Ghi chú : Tôi không rành vl lắm nên có những hàm vl ðã có.

 

Em không biết viết lisp, anh có thể viết ra giùm em được không?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Nếu đây là toàn bộ file của bạn thì phần còn lại chắc chắn phải ở đâu đó (từ người giao file cho bạn chẳng hạn). Đối với file của bạn thì như tdvn đã phân tích là có thể làm được nhưng ngại vì trường hợp này không điển hình lắm. Mình nghỉ tốt nhất bạn tìm phần còn lại của file xem vì không thể có 1 file trụi lủi như vậy được.

 

xin lỗi anh vào mọi người nha, hôm qua em tìm không kỹ, Em tìm thêm được file này, mong mọi ng7o72i giúp em

 

http://www.cadviet.com/upfiles/cao_do.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
xin lỗi anh vào mọi người nha, hôm qua em tìm không kỹ, Em tìm thêm được file này, mong mọi ng7o72i giúp em

 

http://www.cadviet.com/upfiles/cao_do.dwg

Của bạn đây. Hy vọng bạn có thời gian ngồi kiểm tra lổi.

Lưu ý với bạn vấn đề này đã có trên dd rồi lần sau bạn nên tìm trước khi hỏi nhé!

http://www.cadviet.com/upfiles/cao_don.dwg

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Em không biết viết lisp, anh có thể viết ra giùm em được không?

Bạn có thể tham khảo. Tôi lập theo file mẫu "xr_caodo.dwg" của bạn

(defun C:C2T( / SS1 SS2 n1 n2 i LIS1 P p1 lis2 st st1 st2)

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(SETQ SS1 (SSGET "x" '((0 . "TEXT") (8 . "NEN") (72 . 2))))

(SETQ SS2 (SSGET "x" '((0 . "TEXT") (8 . "NEN") (72 . 0))))

(COMMAND "_.MOVE" SS1 "" '(0 0 0) '(0.8 0 0))

; (COMMAND "_.MOVE" SS2 "" '(0.4 0 0) '(0 0 0))

(setq i 0)

(while (< i (sslength ss1))

(setq n1 (ssname ss1 i))

(setq p (dxf n1 11) P (STRCAT (RTOS (CAR P) 2 3) (RTOS (CADR P) 2 3)))

(setq lis1 (append lis1 (list (list p n1))))

(setq i (1+ i))

)

(setq i 0)

(while (< i (sslength ss2))

(setq n2 (ssname ss2 i))

(setq p (dxf n2 10) P1 (STRCAT (RTOS (CAR P) 2 3) (RTOS (CADR P) 2 3)))

(setq lis2 (assoc p1 lis1))

(if lis2 (progn

(setq n1 (cadr lis2))

(setq st1 (dxf n1 1) st2 (dxf n2 1) st (strcat st1 "." st2))

(entmod (subst (cons 1 st) (assoc 1 (entget n1)) (entget n1)))

; (command "_.change" n2 "" "p" "c" 1 "")

(command "_.erase" n2 "")

))

(setq i (1+ i))

)

)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn có thể tham khảo. Tôi lập theo file mẫu "xr_caodo.dwg" của bạn

(defun C:C2T( / SS1 SS2 n1 n2 i LIS1 P p1 lis2 st st1 st2)

(defun dxf( name n)

(cdr (assoc n (entget name)))

)

(SETQ SS1 (SSGET '((0 . "TEXT") (8 . "NEN") (72 . 2))))

(SETQ SS2 (SSGET '((0 . "TEXT") (8 . "NEN") (72 . 0))))

(COMMAND "_.MOVE" SS1 "" '(0 0 0) '(0.8 0 0))

; (COMMAND "_.MOVE" SS2 "" '(0.4 0 0) '(0 0 0))

(setq i 0)

(while (< i (sslength ss1))

(setq n1 (ssname ss1 i))

(setq p (dxf n1 11) P (STRCAT (RTOS (CAR P) 2 3) (RTOS (CADR P) 2 3)))

(setq lis1 (append lis1 (list (list p n1))))

(setq i (1+ i))

)

(setq i 0)

(while (< i (sslength ss2))

(setq n2 (ssname ss2 i))

(setq p (dxf n2 10) P1 (STRCAT (RTOS (CAR P) 2 3) (RTOS (CADR P) 2 3)))

(setq lis2 (assoc p1 lis1))

(if lis2 (progn

(setq n1 (cadr lis2))

(setq st1 (dxf n1 1) st2 (dxf n2 1) st (strcat st1 "." st2))

(entmod (subst (cons 1 st) (assoc 1 (entget n1)) (entget n1)))

; (command "_.change" n2 "" "p" "c" 1 "")

(command "_.erase" n2 "")

))

(setq i (1+ i))

)

)

Bác tdvn và các bác trên diễn đàn có thể giải thích dùm mã DXF 10, DXF 11 của đối tượng Text được không?

Cảm ơn các bác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bác tdvn và các bác trên diễn đàn có thể giải thích dùm mã DXF 10, DXF 11 của đối tượng Text được không?

Cảm ơn các bác.

10 = điểm canh lề thứ nhất.

11 = điểm canh lề thứ hai.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bác tdvn và các bác trên diễn đàn có thể giải thích dùm mã DXF 10, DXF 11 của đối tượng Text được không?

Cảm ơn các bác.

mã dxf 10 chính là điểm định vị của tẽt có kiểu định vị "L". mã dxf 11 chính là điểm định vị của tẽt có kiểu định vị khác như "R", "C" ...

dxf 10 còn là điểm góc dưới trái của hộp textbox của đối tượng tẽt

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đầy đủ của cad này:

 

0005.jpg

 

 

Với text có dạng LEFT, FIT, ALIGNED thì vị trí đặt text là dxf 10

còn tất các các dạng canh lề khác như bottom, center, top.... v.v nó phụ thuộc code 72, 73 và vị trí đặt text là DXF 11.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
xin lỗi anh vào mọi người nha, hôm qua em tìm không kỹ, Em tìm thêm được file này, mong mọi ng7o72i giúp em

 

http://www.cadviet.com/upfiles/cao_do.dwg

Chào bạn thangkho,

Đây là cái lisp mình sửa lại dựa theo gợi ý của bác Duy và cái bản vẽ thực tế mà bạn gửi. Mình dựa vào cái đặc thù của các text cao độ nằm riêng trong lớp textcaodomia để phân loại nó ra và nối chúng lại theo cái lisp của bác Tue_nv.

Bạn hãy thử xem có đạt yêu cầu của bạn không nhé.

Thú thực là mình đã thử rồi và lisp chạy mất khoảng 30 giây thì xong bản vẽ của bạn. Kiểm tra thử một vài khu vực thì thấy ngon phết, nhưng kiểm tra toàn bộ thì chưa có thời gian, mong bạn thông cảm.

(defun c:n2t()
(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 "TEXTCAODOMIA")))
  n (sslength ss)
  i 0
)
(While ((setq te1 (ssname ss i))
(setq te2 (ssname ss (1+ i)))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss2)))
(setq hei (cdr(assoc 40 ss1)))

(Command "style" st "" "0" "" "" "n" "n" "n")
(Command "text" po hei "0" (strcat nd2 "." nd1))
(command "erase" te1 "")
(command "erase" te2 "")
(setq i (+ i 2))
)
(Princ)
)

 

Nếu có gì chưa được bạn hãy cho mình biết để mình tìm cách hoàn thiện nhé. Thanks

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn thangkho,

Đây là cái lisp mình sửa lại dựa theo gợi ý của bác Duy và cái bản vẽ thực tế mà bạn gửi. Mình dựa vào cái đặc thù của các text cao độ nằm riêng trong lớp textcaodomia để phân loại nó ra và nối chúng lại theo cái lisp của bác Tue_nv.

Bạn hãy thử xem có đạt yêu cầu của bạn không nhé.

Thú thực là mình đã thử rồi và lisp chạy mất khoảng 30 giây thì xong bản vẽ của bạn. Kiểm tra thử một vài khu vực thì thấy ngon phết, nhưng kiểm tra toàn bộ thì chưa có thời gian, mong bạn thông cảm.

(defun c:n2t()
(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 "TEXTCAODOMIA")))
  n (sslength ss)
  i 0
)
(While (< i n)
(setq te1 (ssname ss i))
(setq te2 (ssname ss (1+ i)))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss2)))
(setq hei (cdr(assoc 40 ss1)))

(Command "style" st "" "0" "" "" "n" "n" "n")
(Command "text" po hei "0" (strcat nd2 "." nd1))
(command "erase" te1 "")
(command "erase" te2 "")
(setq i (+ i 2))
)
(Princ)
)

 

Nếu có gì chưa được bạn hãy cho mình biết để mình tìm cách hoàn thiện nhé. Thanks

Cảm ơn anh nhiều. Anh có thể chỉnh lại phần text sau khi đổi có dạng jutify là left trùng với điểm point có layer là "TEXTCAODOCOC" ko?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn thangkho,

Ðây là cái lisp mình sửa lại dựa theo gợi ý của bác Duy và cái bản vẽ thực tế mà bạn gửi. Mình dựa vào cái ðặc thù của các text cao ðộ nằm riêng trong lớp textcaodomia ðể phân loại nó ra và nối chúng lại theo cái lisp của bác Tue_nv.

Bạn hãy thử xem có ðạt yêu cầu của bạn không nhé.

Thú thực là mình ðã thử rồi và lisp chạy mất khoảng 30 giây thì xong bản vẽ của bạn. Kiểm tra thử một vài khu vực thì thấy ngon phết, nhýng kiểm tra toàn bộ thì chýa có thời gian, mong bạn thông cảm.

(defun c:n2t()
(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 "TEXTCAODOMIA")))
  n (sslength ss)
  i 0
)
(While (< i n)
(setq te1 (ssname ss i))
(setq te2 (ssname ss (1+ i)))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss2)))
(setq hei (cdr(assoc 40 ss1)))

(Command "style" st "" "0" "" "" "n" "n" "n")
(Command "text" po hei "0" (strcat nd2 "." nd1))
(command "erase" te1 "")
(command "erase" te2 "")
(setq i (+ i 2))
)
(Princ)
)

 

Nếu có gì chýa ðýợc bạn hãy cho mình biết ðể mình tìm cách hoàn thiện nhé. Thanks

Góp ý tí, nếu có gì xin ðừng giận nhé.

Bạn dùng cái trật tự này

(setq te1 (ssname ss i))

(setq te2 (ssname ss (1+ i)))

là rất nguy hiểm vì nếu nhý cái text tạo nên cao ðộ không ðýợc sinh ra cùng một quy luật mà ðýợc copy lại từ những text ðã có rối chỉnh lại giá trị hay bản vẽ có ðoạn ðýợc insert vào thêm hay những lý do khác thì cái trật tự trýớc sau khó mà phân biệt ðýợc. Trong ngành bản ðồ, theo nhý tôi biết thì các ðiểm ðộ cao thýờng ðýợc "tãng dày" trong giai ðoạn biên tập chứ chýa hẳn ðýợc ðo ðạc hoàn toàn.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Góp ý tí, nếu có gì xin ðừng giận nhé.

Bạn dùng cái trật tự này

(setq te1 (ssname ss i))

(setq te2 (ssname ss (1+ i)))

là rất nguy hiểm vì nếu nhý cái text tạo nên cao ðộ không ðýợc sinh ra cùng một quy luật mà ðýợc copy lại từ những text ðã có rối chỉnh lại giá trị hay bản vẽ có ðoạn ðýợc insert vào thêm hay những lý do khác thì cái trật tự trýớc sau khó mà phân biệt ðýợc. Trong ngành bản ðồ, theo nhý tôi biết thì các ðiểm ðộ cao thýờng ðýợc "tãng dày" trong giai ðoạn biên tập chứ chýa hẳn ðýợc ðo ðạc hoàn toàn.

Mình làm theo cách là phải cón point gốc. Lấy toàn bộ piont làm tập hợp chọn. lấy tọa độ point chọn về phía trước 1 chút gán cho texttruoc. chọn về phía sau 1 chút gán cho textsau. Viết ra text mới bắng cách nối hai anh này lại thêm dấu chấm vào giửa.

Cái bản vẻ của bạn này chạy mất hơn 5 phút (nghe bác Bình bảo có mấy giây thì phục thật).

Cách của mình có vấn đề là quanh point nếu không chọn được text thì bị lỗi và dừng lại. Các text gần nhau thì kết quả đọc bị sai.

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình làm theo cách là phải cón point gốc. Lấy toàn bộ piont làm tập hợp chọn. lấy tọa độ point chọn về phía trước 1 chút gán cho texttruoc. chọn về phía sau 1 chút gán cho textsau. Viết ra text mới bắng cách nối hai anh này lại thêm dấu chấm vào giửa.

Cái bản vẻ của bạn này chạy mất hơn 5 phút (nghe bác Bình bảo có mấy giây thì phục thật).

Cách của mình có vấn đề là quanh point nếu không chọn được text thì bị lỗi và dừng lại. Các text gần nhau thì kết quả đọc bị sai.

Lệnh chọn đối tượng của cad hữu ích nhưng đôi lúc mất thời gian và kém chính xác. Nếu dùng nhiều lần quá trong một lệnh thì không tiện

Cái list mình viết chạy khoảng 4'', nhưng còn tùy máy

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Góp ý tí, nếu có gì xin ðừng giận nhé.

Bạn dùng cái trật tự này

(setq te1 (ssname ss i))

(setq te2 (ssname ss (1+ i)))

là rất nguy hiểm vì nếu nhý cái text tạo nên cao ðộ không ðýợc sinh ra cùng một quy luật mà ðýợc copy lại từ những text ðã có rối chỉnh lại giá trị hay bản vẽ có ðoạn ðýợc insert vào thêm hay những lý do khác thì cái trật tự trýớc sau khó mà phân biệt ðýợc. Trong ngành bản ðồ, theo nhý tôi biết thì các ðiểm ðộ cao thýờng ðýợc "tãng dày" trong giai ðoạn biên tập chứ chýa hẳn ðýợc ðo ðạc hoàn toàn.

Chào bác tdvn,

Hì hì, thú thực mình là dân me cha ni cô, có biết tí gì về ngành đo đạc bản đồ đâu ạ. Bác chỉ cho cái lỗi tày đình này thật may quá chứ không bạn thangkho mắng mình chết.

Thực ra mình chỉ dựa trên suy luận của mình là các cặp text này thế nào cũng phải được nhập liên tiếp nhau vì nó thể hiện gía tri cao độ mà thôi, chứ nếu mà người vẽ cứ nhập loạn theo kiểu bác nói là lisp này sai ngay. Vì suy luận vậy và kiểm tra thử các mả dxf của một vài cặp text mẫu thấy đúng nên mình quy nạp nó luôn cho toàn bộ các thằng khác. Tếu thật bác nhỉ.

Khi chạy thử với cái bản vẽ của bạn thangkho và kiểm tra kết quả ở một số vùng thấy ngon là mình mừng húm, post lên luôn chứ có biết là dại đâu ạ.

Mà cái lisp này cũng chỉ phù hợp với cái bản vẽ đó thôi vì các cặp text này nằm riêng trên lớp Textcaodomia chứ các bản vẽ khác thì chả biết nó có vậy không, nó lại nằm trên lớp củ chuối là lisp cũng không dùng được. Khi đó lại phải viết thêm cái khúc lấy tên lớp của các cặp text này đã rồi mới chọn đối tượng được bác nhỉ.

Túm lại là cái lisp của mình mới chỉ là thử tìm cách giải quyết nhiệm vụ của bạn thangkho trên một bản vẽ cụ thể của bạn ấy post chứ chưa phải là đã hoàn chỉnh để có thể dùng trong mọi trường hợp tương tự bác nhể. Do chưa hiểu về cách làm việc của các bác ngành đo đạc bản đồ nên mong bác chỉ dạy thêm.

Mình xin thành thật nhận thiếu sót và rút kinh nghiệm, mong các bác tha cho cái sự ấu trĩ của mình. Hì hì.

 

Mình cũng đã đọc cái gợi ý của bác nhưng do kiến thức về các hàm vl- ... và vlax- .... của mình còn mỏng quá nên không dám đụng vô. Bác thông cảm nhé chứ chả phải mình không quan tâm đến ý kiến của bác đâu. Hiện mình cũng đang cố gắng đọc hiểu cái lisp bác post đấy. Có chỗ nào chưa thủng thì mình sẽ làm phiền bác nhé.

 

Chúc bác luôn vui khỏe,

 

@thangkho: Bạn nên lưu ý cái bác tdvn đã post. Cái lisp của mình chỉ xài được với điều kiện các text cao độ phải được nhập theo từng cặp liên tiếp nhau và nằm trên lớp Textcaodomia thôi nhé. Việc bạn muốn text sau khi sửa nẳm ở đúng vị trí nào thì bạn chỉ cần thay đổi tọa độ của điểm đó vào vị trí điểm po trong hàm (command "text" po hei ........) mà thôi.

Do mình chưa rõ cái quy luật giữa vị trí điểm và vi trí đặt text cao độ của điểm trên bản vẽ hiện tại nên chưa giúp bạn ngay được. Để mình tìm hiểu thêm cái quy luật này rồi sẽ bổ sung sau nhé.

 

@bác Duy: Bác thử xem chứ mình chả dám nói điêu đâu. Là cái lisp nó chạy chứ mình có chạy đâu mà nói ngoa làm chi. Mà mình nói là 30 giây chứ chả phải là mấy giây bác ạ. Hì hì bác cho mình "kãi thật" một tí nhé.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cảm ơn anh nhiều. Anh có thể chỉnh lại phần text sau khi đổi có dạng jutify là left trùng với điểm point có layer là "TEXTCAODOCOC" ko?

Chào bạn thangkho,

Của bạn đây, nhưng bạn lưu ý những điều bác tdvn đã post. Mình đã chạy thử với cái bản vẽ của bạn post thì OK, nhưng với các bản vẽ mà người làm nhập text cao độ không theo quy luật như bản vẽ bạn post là thua đấy. Vì mình còn non nên chưa xử lý được tình trạng như bác tdvn đã nêu. Mình sẽ nghiên cứu thêm, nếu tìm ra phương pháp khả dĩ sẽ trao đổi với bạn sau.

Cái lisp này chạy hết bản vẽ của bạn mất chừng 1phút hơn, Mình vẫn dựa trên suy luận cũ và chỉ bổ sung phần chọn điểm đặt text mà thôi. Để làm điều này mình dựa trên các điểm mốc trên lớp TEXTCAODOCOC của bạn có cùng tọa độ y với các text cao độ trên lớp TEXTCAODOMIA. Do vậy nếu như với các bản vẽ khác mà người vẽ không làm đúng quy luật này thì chắc lisp này cũng thua luôn. Do mình không phải dân đo dạc bản đồ nên không hiểu nhiều về công việc của bạn, chỉ tự suy luận từ bản vẽ bạn post để làm lisp thôi nên có thể chưa đúng ý bạn lắm. Bạn có thể tham khảo và dựa vào cái lisp của mình để cải tạo cho phù hợp với yêu cầu của bạn. Nếu có chỗ nào chưa hiểu thì hãy post lên ình sẽ giải thích rõ vì sao mình làm vậy.

Rất mong bạn sử dụng được chút nào cái lisp của mình.

(defun c:n2t()
(setq a (cdr (assoc 8 (entget (car (entsel "\n Chon text thuoc mot cap text can noi "))))))
;;; Chu y : Tat ca cac cap text can noi phai nam tren cung mot lop va duoc nhap lien tiep

(setq b (cdr (assoc 8 (entget (car (entsel "\n Chon diem co cao do can noi "))))))
;;; Chu y: Tat cac cac diem co cao do can noi phai nam tren cung mot lop

(setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 a)))
  n (sslength ss)
  i 0
  ssp (ssget "X" (list (cons 0 "POINT") (cons 8 b)))
  m (sslength ssp)

)

(While ((setq te1 (ssname ss i))
(setq te2 (ssname ss (1+ i)))
;;;(setq p1 (cdr (assoc 10 (entget (ssname ss (+ i 2))))))
(setq ss1 (entget te1))
(setq ss2 (entget te2))

(setq nd1 (cdr (assoc 1 ss1)))
(setq nd2 (cdr (assoc 1 ss2)))
(setq st (cdr (assoc 7 ss1)))

(setq po (cdr (assoc 10 ss2)))
(setq hei (cdr(assoc 40 ss1)))
(setq j 0)

(while ((setq p1 (cdr (assoc 10 (entget (ssname ssp j)))))
(if (= (cadr p1) (cadr po))
(progn 
(Command "style" st "" "0" "" "" "n" "n" "n")
(Command "text" "j" "bl" p1 hei "0" (strcat nd2 "." nd1))
(command "erase" te1 "")
(command "erase" te2 "")
;;; (command "point" p1)
)
)
(setq j (1+ j))
)

(setq i (+ i 2))
)

(Princ)
)

 

Chúc bạn vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×