Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

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

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

File excel (số liệu ở dạng table): http://www.mediafire.com/?uzzbncz08j6hief

Xuất sang file cad (xem như là file trắng) thì các text ở dạng DTEXT.

 

---

Thực ra mình chỉ cần 1 lệnh tắt thay cho các bước "Edit - Paste special - Autocad Entities" thôi (còn nguồn và kết quả k quan trọ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

Em xin hỏi cách viết text bằng tiếng việt.

- Khi muốn viết một dòng text có nội dung : "Chào cad việt. Tôi là học hoài vẫn dốt" chẳng hạn.

1_23.jpg

Tôi dùng hàm (entmake (list (cons 0 "TEXT") (cons 1 "...").

Nếu muốn viết text trên với font Unicode, VNI, TCVN3, Vietwarex thì nội dung ... sẽ khác nhau.

viet.jpg

Trường hợp tương tự khi em muốn viết nội dung tiếng việt cho hộp thoại ứng với các font tuơng ứng cũng vậy.

Để tạo ra kết quả này em làm theo cách viết text trong cad với nội dung cần và với style có font chữ cần. Sau đó tìm max DXF 1 của text.

1. Nếu diễn đàn đã có bài viết hay topic nào liên quan mong các anh chỉ giúp link (em thử tìm mà không thấy).

2. Có cách nào nhanh để lấy các nội dung "..." này.

3. Quy luật tạo ra các nội dung này là như thế nào.

4. Em yêu cầu 1 lisp convert text sang nội dung ... của nó.

Đầu vào và đầu ra như sau :

3_6.jpg

Khi nhập text dầu vào nếu có thể thì mình quy định luôn nhập bằng unicode hoặc là luôn nhập bằng TCVN3.

Còn text kết quả thì tuỳ thuộc là lựa chọn ở popup_list .

 

Đây là file đính kèm các anh em ghi nội dung yêu cầu. http://www.cadviet.com/upfiles/3/tieng_viet.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 chào mọi người, mình có một vấn dề cần mọi người giúp đỡ: mình cần tách 1 đoạn text gồm nhiều từ thành nhiều đoạn nhỏ, ví dụ mình có 1 câu viết bằng Dtext : "Dien dan cadviet rất hữu ích" Giờ mình muốn chia câu đó thành 3 câu riêng biệt là " Dien dan" ; "cadviet" ; "rất hữu ích"

Mọi người có cách nào giúp mình với,vì mình cần tách câu với một khối lượng khổng lồ, cứ copy rồi edit chắc mình chết mất. Rất cám ơn mọi người

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 chào mọi người, mình có một vấn dề cần mọi người giúp đỡ: mình cần tách 1 đoạn text gồm nhiều từ thành nhiều đoạn nhỏ, ví dụ mình có 1 câu viết bằng Dtext : "Dien dan cadviet rất hữu ích" Giờ mình muốn chia câu đó thành 3 câu riêng biệt là " Dien dan" ; "cadviet" ; "rất hữu ích"

Mọi người có cách nào giúp mình với,vì mình cần tách câu với một khối lượng khổng lồ, cứ copy rồi edit chắc mình chết mất. Rất cám ơn mọi người

Quy luật như nào?

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 xin hỏi cách viết text bằng tiếng việt.

- Khi muốn viết một dòng text có nội dung : "Chào cad việt. Tôi là học hoài vẫn dốt" chẳng hạn.

1_23.jpg

Tôi dùng hàm (entmake (list (cons 0 "TEXT") (cons 1 "...").

Nếu muốn viết text trên với font Unicode, VNI, TCVN3, Vietwarex thì nội dung ... sẽ khác nhau.

viet.jpg

Trường hợp tương tự khi em muốn viết nội dung tiếng việt cho hộp thoại ứng với các font tuơng ứng cũng vậy.

Để tạo ra kết quả này em làm theo cách viết text trong cad với nội dung cần và với style có font chữ cần. Sau đó tìm max DXF 1 của text.

1. Nếu diễn đàn đã có bài viết hay topic nào liên quan mong các anh chỉ giúp link (em thử tìm mà không thấy).

2. Có cách nào nhanh để lấy các nội dung "..." này.

3. Quy luật tạo ra các nội dung này là như thế nào.

4. Em yêu cầu 1 lisp convert text sang nội dung ... của nó.

Đầu vào và đầu ra như sau :

3_6.jpg

Khi nhập text dầu vào nếu có thể thì mình quy định luôn nhập bằng unicode hoặc là luôn nhập bằng TCVN3.

Còn text kết quả thì tuỳ thuộc là lựa chọn ở popup_list .

 

Đây là file đính kèm các anh em ghi nội dung yêu cầu. http://www.cadviet.com/upfiles/3/tieng_viet.dwg

Hề hề hề,

Chưa hiễu yêu cầu của bạn,

Nếu bạn muốn dùng lisp thì khổ lắm lisp chửa có hỗ trợ viết text tiếng Việt

Còn bạn muốn vẽ chữ trên bản vẽ thì bạn đã làm khá tốt đó thôi.

 

Trong các mã DXF của text, Có mã DXF 7 là để xác định cái Style của text . Bạn có thể tạo trước các style theo tiếng việt của bạn rồi khi tạo text bạn thêm thằng (cons 7 "Cái style bạn khoái") vào. Khi đó lưu ý rằng bạn phải nhập nội dung text theo đúng cái kiểu gõ mà bạn dùng trong style của bạn nó mới cho được hiển thị tiếng Việt bạn nhé. Dưng mà trong code thì cái text ấy nó chả giống ai bạn cũng hổng được phàn nàn đâu đấy. Hề hề hề.

 

Chúc bạn chóng giỏi hỉ....

  • 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
Xin chào mọi người, mình có một vấn dề cần mọi người giúp đỡ: mình cần tách 1 đoạn text gồm nhiều từ thành nhiều đoạn nhỏ, ví dụ mình có 1 câu viết bằng Dtext : "Dien dan cadviet rất hữu ích" Giờ mình muốn chia câu đó thành 3 câu riêng biệt là " Dien dan" ; "cadviet" ; "rất hữu ích"

Mọi người có cách nào giúp mình với,vì mình cần tách câu với một khối lượng khổng lồ, cứ copy rồi edit chắc mình chết mất. Rất cám ơn mọi người

Hề hề hề,

Chắc chết thì làm làm chi hỉ??? Nghỉ cho nó béo sướng hơn.

Còn không chết mà vẫn phải làm thì hãy nghĩ kỹ cái yêu cầu của bác Duy đó và đưa ra cái quy luật cần tách hoặc giả post lên vài cái text chưa tách và cái kết quả sau khi tách để mọi người còn đoán được cái bạn cần là chi nhé. Với một cái ví dụ chỏng lỏn vậy thì chịu khó ngồi chờ xem may ra có ông thần nào đoán được cái bạn cần không đã. Hề hề hề.....

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 chào mọi người, mình có một vấn dề cần mọi người giúp đỡ: mình cần tách 1 đoạn text gồm nhiều từ thành nhiều đoạn nhỏ, ví dụ mình có 1 câu viết bằng Dtext : "Dien dan cadviet rất hữu ích" Giờ mình muốn chia câu đó thành 3 câu riêng biệt là " Dien dan" ; "cadviet" ; "rất hữu ích"

Mọi người có cách nào giúp mình với,vì mình cần tách câu với một khối lượng khổng lồ, cứ copy rồi edit chắc mình chết mất. Rất cám ơn mọi người

 

Cái này theo mình cũng dễ, không cần quy luật

Chỉ cần tạo họp thoại dialog ghi lại câu dtext đó

Quy luật của nó là người dùng lựa chọn tuỳ ý theo dấu cách SPACE

Dùng hàm while để tách riêng ra từng đoạn text nhỏ (mỗi câu text được tách ra = khoảng trống space)

Trên hộp thoại xài phím Next (để chọn từng đoạn text theo yêu cầu) và phím OK để ghi ra đoạn text cần tách là xong

Nhưng trường hợp này cũng ít gặp khi thao tác với AutoCad

  • 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
Hề hề hề,

Chưa hiễu yêu cầu của bạn,

Nếu bạn muốn dùng lisp thì khổ lắm lisp chửa có hỗ trợ viết text tiếng Việt

Còn bạn muốn vẽ chữ trên bản vẽ thì bạn đã làm khá tốt đó thôi.

 

Trong các mã DXF của text, Có mã DXF 7 là để xác định cái Style của text . Bạn có thể tạo trước các style theo tiếng việt của bạn rồi khi tạo text bạn thêm thằng (cons 7 "Cái style bạn khoái") vào. Khi đó lưu ý rằng bạn phải nhập nội dung text theo đúng cái kiểu gõ mà bạn dùng trong style của bạn nó mới cho được hiển thị tiếng Việt bạn nhé. Dưng mà trong code thì cái text ấy nó chả giống ai bạn cũng hổng được phàn nàn đâu đấy. Hề hề hề.

 

Chúc bạn chóng giỏi hỉ....

 

Với trường hợp viết text unicode. Em có lisp sau làm theo ý anh phamthanhbinh.

(defun C:txt ()
(setq cont_uni "Chào Cad Vi?t. Tôi là h?c hoài v?n d?t")
(command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "")
(entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 0 0)) (cons 40 2) (cons 7 "TEXT_UNICODE")))
)

Chào Cad Vi?t. Tôi là h?c hoài v?n d?t trong đoạn code làm theo ý anh em đánh bằng Vietkey bảng mã Unicode.

Kết quả không như ý

 

Nếu viết như sau thì cho kết quả đúng :

(defun C:txt1 ()
(setq cont_uni "Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t.")
(command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "")
(entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 5 0)) (cons 40 2) (cons 7 "TEXT_UNICODE")))
)

Vấn đề là Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t có quy luật như thế nào. Làm thế nào để biết phải ghi các ký tự Vi\\U+1EC7t

h\\U+1ECDc v\\U+1EABn d\\U+1ED1t

 

Có thể em chưa hiểu hết ý anh phamthanhbinh. Mong được anh giải thích chỗ này. Cảm ơn lời chúc của anh. Hi!

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
Với trường hợp viết text unicode. Em có lisp sau làm theo ý anh phamthanhbinh.

(defun C:txt ()
(setq cont_uni "Chào Cad Vi?t. Tôi là h?c hoài v?n d?t")
(command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "")
(entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 0 0)) (cons 40 2) (cons 7 "TEXT_UNICODE")))
)

Chào Cad Vi?t. Tôi là h?c hoài v?n d?t trong đoạn code làm theo ý anh em đánh bằng Vietkey bảng mã Unicode.

Kết quả không như ý

 

Nếu viết như sau thì cho kết quả đúng :

(defun C:txt1 ()
(setq cont_uni "Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t.")
(command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "")
(entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 5 0)) (cons 40 2) (cons 7 "TEXT_UNICODE")))
)

Vấn đề là Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t có quy luật như thế nào. Làm thế nào để biết phải ghi các ký tự Vi\\U+1EC7t

h\\U+1ECDc v\\U+1EABn d\\U+1ED1t

 

Có thể em chưa hiểu hết ý anh phamthanhbinh. Mong được anh giải thích chỗ này. Cảm ơn lời chúc của anh. Hi!

Không cần thiết phải biết quy luật của nó. hình như bạn muốn viết hộp thoại sử dụng unicode, Bạn làm đúng huớng rồi đó. Bạn co the tham khảo cách làm của bác Hoành tại đây

  • 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
Xin chào mọi người, mình có một vấn dề cần mọi người giúp đỡ: mình cần tách 1 đoạn text gồm nhiều từ thành nhiều đoạn nhỏ, ví dụ mình có 1 câu viết bằng Dtext : "Dien dan cadviet rất hữu ích" Giờ mình muốn chia câu đó thành 3 câu riêng biệt là " Dien dan" ; "cadviet" ; "rất hữu ích"

Mọi người có cách nào giúp mình với,vì mình cần tách câu với một khối lượng khổng lồ, cứ copy rồi edit chắc mình chết mất. Rất cám ơn mọi người

 

Mình thấy cách này thì đỡ phải viết thêm líp này.

Chọn cái DTEXT rồi dùng cái líp Convert TEXT to MTEXT của EXPRESS TOOL. Rồi vào cái mtext đấy muốn chia đến đâu thì ấn Ẻnter cho nó xuống dòng. Thấy vừa ý rồi thì dùng lệnh EXPLODE cái MTEXT ấy đi là nó biến thành Dtext rồi.

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ổ sung phần Highlight đối tuợng đuợc chọn và dùng getdist để nhập kh/cách.

Thanks to duy782006.

 

(defun c:mmo(/ ang dis pt ss)
 (defun *error* (msg)
   (if ss (ssredraw ss 4))
   (if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
     (princ (strcat "\n** Error: " msg " **")))
   (princ))
 (defun ssredraw (ss mode / i ename)
   (setq i -1)
   (while (setq ename (ssname ss (setq i (1+ i))))
     (redraw (ssname ss i) mode)
   )
 )

 (or *dis* (setq *dis* 200))
 (or *ang* (setq *ang* 0))

 (princ "\nChon doi tuong muon di chuyen :")
 (while (setq ss (ssget))
   (ssredraw ss 3)
   (setq ang (getangle (strcat "\nNhap goc muon di chuyen <" (angtos *ang*) ">: ")))
   (if ang (setq *ang* ang))

   (initget 2)
   (setq dis (getdist (strcat "\nNhap khoang cach <" (rtos *dis*) ">: ")))
   (if dis (setq *dis* dis))

   (ssredraw ss 4)
   (command "move" ss "" (setq pt (getvar "lastpoint")) (polar pt *ang* *dis*))
   (princ "\nChon doi tuong muon di chuyen :")
   )
 (princ)
 )

Nhờ anh giúp em bổ sung phần copy tâng theo số lượng đối tượng khi được chọn, líp hỏi góc, khoảng cách theo X, số lượng cần tạo theo phương X: khoảng cách theo Y, số lượng cần tạo theo phương Y: ( GIỐNG NHƯ ARAY )

MONG ĐƯỢC ANH GIÚP

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
Với trường hợp viết text unicode. Em có lisp sau làm theo ý anh phamthanhbinh.

(defun C:txt ()
(setq cont_uni "Chào Cad Vi?t. Tôi là h?c hoài v?n d?t")
(command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "")
(entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 0 0)) (cons 40 2) (cons 7 "TEXT_UNICODE")))
)

Chào Cad Vi?t. Tôi là h?c hoài v?n d?t trong đoạn code làm theo ý anh em đánh bằng Vietkey bảng mã Unicode.

Kết quả không như ý

 

Nếu viết như sau thì cho kết quả đúng :

(defun C:txt1 ()
(setq cont_uni "Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t.")
(command "-style" "TEXT_UNICODE" "Arial" "" "" "" "" "")
(entmake (list (cons 0 "TEXT") (cons 1 cont_uni) (cons 10 (list 0 5 0)) (cons 40 2) (cons 7 "TEXT_UNICODE")))
)

Vấn đề là Chào Cad Vi\\U+1EC7t. Tôi là h\\U+1ECDc hoài v\\U+1EABn d\\U+1ED1t có quy luật như thế nào. Làm thế nào để biết phải ghi các ký tự Vi\\U+1EC7t

h\\U+1ECDc v\\U+1EABn d\\U+1ED1t

 

Có thể em chưa hiểu hết ý anh phamthanhbinh. Mong được anh giải thích chỗ này. Cảm ơn lời chúc của anh. Hi!

Hề hề hề,

Ở đoạn lisp thứ hai mới là đúng ý.

Muốn biết cái quy luật thì hơi loằng ngoằng, bạn phải gõ các text có dấu nhiều lần rồi so sánh giữa cái hiển thị trong lisp và cái đã gõ mới rút ra được.

Cách củ chuối này có thể áp dụng mà khỏi cần quan tâm tới quy luật. Đó là cứ gõ một text mình muốn lên bản vẽ, sau đó copy các giá trị của (cdr (asoc 1 "tetxt vừa gõ")) . Sau đó paste nó vào các chỗ lisp cần, hề hề hề....

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
Hề hề hề,

Chắc chết thì làm làm chi hỉ??? Nghỉ cho nó béo sướng hơn.

Còn không chết mà vẫn phải làm thì hãy nghĩ kỹ cái yêu cầu của bác Duy đó và đưa ra cái quy luật cần tách hoặc giả post lên vài cái text chưa tách và cái kết quả sau khi tách để mọi người còn đoán được cái bạn cần là chi nhé. Với một cái ví dụ chỏng lỏn vậy thì chịu khó ngồi chờ xem may ra có ông thần nào đoán được cái bạn cần không đã. Hề hề hề.....

http://www.cadviet.com/upfiles/3/03_dmm_completion.dwg

đây là file cad của mình, mình cần tách các dòng text ra làm 3 phần: 1 phần là diễn giài tên khối lwợng, 1 phần là phần số, một phần còn lại là phần đơn vị, Mình đã làm mẫu 1 số dòng rồi(những dòng mà phần số mình đổi thành layer màu xanh ấy)

Rất mong nhận được sự giúp đỡ của mọi người, chân thành cám ơn mọi ý kiến dóng góp

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ái này theo mình cũng dễ, không cần quy luật

Chỉ cần tạo họp thoại dialog ghi lại câu dtext đó

Quy luật của nó là người dùng lựa chọn tuỳ ý theo dấu cách SPACE

Dùng hàm while để tách riêng ra từng đoạn text nhỏ (mỗi câu text được tách ra = khoảng trống space)

Trên hộp thoại xài phím Next (để chọn từng đoạn text theo yêu cầu) và phím OK để ghi ra đoạn text cần tách là xong

Nhưng trường hợp này cũng ít gặp khi thao tác với AutoCad

thật sự những thủ thuật bạn nói đối với mình rất mới lạ, bạn có thể hưóng dẫn cụ thể từng bưóc đc ko, ví dụ làm sao tạo hộp thoại dialog, lệnh while là như thế nào, sao mình tháy giống excel chứ ko phải là bản vẽ auto cad, có lẽ do mình nói ko kỹ, tks bạn nha

 

Mình thấy cách này thì đỡ phải viết thêm líp này.

Chọn cái DTEXT rồi dùng cái líp Convert TEXT to MTEXT của EXPRESS TOOL. Rồi vào cái mtext đấy muốn chia đến đâu thì ấn Ẻnter cho nó xuống dòng. Thấy vừa ý rồi thì dùng lệnh EXPLODE cái MTEXT ấy đi là nó biến thành Dtext rồi.

 

đây cũng là 1 cách, cám ơn bạn nhưng như vậy sau khi tách xong bạn vẫn phải move tung text lên vị trí cũ để tạo thành 1 câu liên tục, vậy có mất thòi gian quá ko bạn,

thanhk bạn nhiều

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
http://www.cadviet.com/upfiles/3/03_dmm_completion.dwg

đây là file cad của mình, mình cần tách các dòng text ra làm 3 phần: 1 phần là diễn giài tên khối lwợng, 1 phần là phần số, một phần còn lại là phần đơn vị, Mình đã làm mẫu 1 số dòng rồi(những dòng mà phần số mình đổi thành layer màu xanh ấy)

Rất mong nhận được sự giúp đỡ của mọi người, chân thành cám ơn mọi ý kiến dóng góp

Tue_NV đã tách chuỗi cho bạn xong. Việc xuất chuỗi , viết Text -> Hy vọng bạn làm được

Kết quả tách chuỗi ở biến C1; C2 và C3

Lisp chạy ứng với Text có kí tự dạng * = #*

như bản vẽ bạn đã post.

Đây là code

(defun c:tchu(/ L pat ents i2 i3 i str str2 C1 C2 C3)
 (setq pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "." ","))
 (setq ents (acet-ss-to-list (ssget '((0 . "TEXT") (1 . "* = #*"))))
L '() i2 nil)
 (foreach x (mapcar '(lambda(x) (acet-dxf 1 (entget x))) ents)
   (setq i 1 L1 "" L2 "")
   (while (    	(setq str (substr x (setq i (1+ i)) 3))
   	(if (= str " = ") (progn
   (setq i2 (+ i 2))
      (while (	         (if (vl-position (setq str2 (substr x (setq i2 (1+ i2)) 1)) pat)
            (setq L1 (strcat L1 str2) i3 i2)
	    (setq i2 (strlen x))
         )
      )
) )
   )
  (setq C1 (substr x 1 (- i3 (strlen L1)))
 C2 (substr x (1+ (strlen C1)) (strlen L1))
 C3 (substr x (1+ i3) (- i2 i3))
  )
  (alert (strcat C1 "\n" C2 "\n" C3))
 )
)

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 muốn nhờ mọi người viết cho lisp điền giá trị đo được là diện tích (được pick chọn từ hatch or poline khép kín), chiều dài (được pick chọn từ pline, line vào block thuộc tính đã được lập sẵn.

- Cụ thể cấu trúc lisp như sau :

+ Tên lệnh : DTCD

+ Chọn vùng diện tích

+ Chọn đoạn thẳng

+ Chọn block cần điền ( block có tên BG đã đc lập sẵn)

- Chú ý : phải chọn diện tích trước vì thứ tự điền giá trị trong block thuộc tính mình đã lập là để diện tích trước xong đến chiều dài.

- Anh em xem giùm nhé,có chỗ nào chưa rõ ý của mình thì để mình nói thêm dau nhé.

- Cám ơn đã quan tâm .

 

 

Bạn hãy gửi lại file nhé, file đã gửi không mở được.

-Mọi người xem vấn đề của mình nhé, mình uplại bản vẽ link đây: http://www.cadviet.com/upfiles/3/cadvietcom_2.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
-Mọi người xem vấn đề của mình nhé, mình uplại bản vẽ link đây: http://www.cadviet.com/upfiles/3/cadvietcom_2.dwg

Của bạn đây. Đúng với file bạn up lên.

(defun c:dtcd ()
 (setq dth (car (entsel "\nChon vung can tinh dien tich"))
pl (car (entsel "\nChon pline can tinh chieu dai"))
ob1 (vlax-ename->vla-object dth)
ob2 (vlax-ename->vla-object pl)
dientich (vla-get-area ob1)
chieudai (vla-get-length ob2)
blatt (car (entsel "\nChon block attribute"))
ent (entget blatt))
 (if (= (cdr (assoc 66 ent)) 1)
   (progn
     (setq name1 (entnext blatt)
    ent1 (entget name1))
     (entmod (subst (cons 1 (rtos dientich 2 2)) (assoc 1 ent1) ent1))
     (entupd blatt)
     (setq name2 (entnext name1)
    ent2 (entget name2))
     (entmod (subst (cons 1 (rtos chieudai 2 2)) (assoc 1 ent2) ent2))
     (entupd blatt)
     )
   (alert "doi tuong duoc chon khong phai la block attibute")
   )
 )

  • 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

Em có mấy bản cad (file sau khi được số hoá từ file jpg) nó có rất nhiều line vụn, nếu xoá thủ công thì lâu quá. Các bro giúp em viết 1 lisp để xoá tất cả các line, pline vụn ở trong bản cad được không? Cám ơn các bro trướ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
Tue_NV đã tách chuỗi cho bạn xong. Việc xuất chuỗi , viết Text -> Hy vọng bạn làm được

Kết quả tách chuỗi ở biến C1; C2 và C3

Lisp chạy ứng với Text có kí tự dạng * = #*

như bản vẽ bạn đã post.

Mạn phép bác Tue_NV, mình sử dụng lisp của bác bổ sung thêm phần ghi lại text mới vào vị trí gần đúng với text cũ cho bạn ceddtu . Việc ghi lại cho hoàn toàn chính xác là vấn đề khá khó chịu nên mình chỉ dừng ở đây. Lý do là do số lượng các ký tự khá khác nhau và khoảng cách giữa các ký tự cũng hoàn toàn không giống nhau. Mình đã tận dụng đến thông số width factor nhưng chỉ đạt gần đúng. Hy vọng bạn ceddtu hài lòng.

(defun c:tchu(/ L pat ents i2 i3 i str str2 C1 C2 C3)
(setq pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "." ","))
(setq ents (acet-ss-to-list (ssget '((0 . "TEXT") (1 . "* = #*"))))
L '() i2 nil)

(foreach y ents
(setq x (cdr (assoc 1 (entget y))))
(setq i 1 L1 "" L2 "")
(while ((setq str (substr x (setq i (1+ i)) 3))
(if (= str " = ") (progn
(setq i2 (+ i 2))
(while ((if (vl-position (setq str2 (substr x (setq i2 (1+ i2)) 1)) pat)
(setq L1 (strcat L1 str2) i3 i2)
(setq i2 (strlen x))
)
)
) )
)
(setq C1 (substr x 1 (- i3 (strlen L1)))
C2 (substr x (1+ (strlen C1)) (strlen L1))
C3 (substr x (1+ i3) (- i2 i3))
)
;;;;;;(alert (strcat C1 "\n" C2 "\n" C3))
(setq els (entget y)
       b (cdr (assoc 41 els))
       p1 (cdr (assoc 10 els))
       p2 (list (+ (car p1) (* b h 0.9 (1+ (strlen C1)))) (cadr p1))
       p3 (list (+ (car p2) (* b h 0.9 (1+ (strlen L1)))) (cadr p2))
       h (cdr (assoc 40 els))
       st (cdr (assoc 7 els))
       els (subst (cons 1 C1) (assoc 1 els) els)
)
(entmod els)
(entmake
(list (cons 0 "text") (cons 10 p2) (cons 1 C2) (cons 62 3) (cons 7 st) (cons 40 h) (cons 41 b ))
)
(entmake
(list (cons 0 "text") (cons 10 p3) (cons 1 C3) (cons 62 2) (cons 7 st) (cons 40 h) (cons 41 b ))
)
)

)

 

@ Bác Tue_NV: Tiện đây bác cho hỏi luôn cái vụ ký tự # là thay cho các chữ số hử bác??? Mình lọ mọ mà chả tìm thấy chỗ nào nói về cách sử dụng các ký tự như vậy trong lisp cả bác ạ. Nếu có tài liệu, bác post lên giùm cho anh em được mót với.....

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ủa bạn đây. Đúng với file bạn up lên.

(defun c:dtcd ()
 (setq dth (car (entsel "\nChon vung can tinh dien tich"))
pl (car (entsel "\nChon pline can tinh chieu dai"))
ob1 (vlax-ename->vla-object dth)
ob2 (vlax-ename->vla-object pl)
dientich (vla-get-area ob1)
chieudai (vla-get-length ob2)
blatt (car (entsel "\nChon block attribute"))
ent (entget blatt))
 (if (= (cdr (assoc 66 ent)) 1)
   (progn
     (setq name1 (entnext blatt)
    ent1 (entget name1))
     (entmod (subst (cons 1 (rtos dientich 2 2)) (assoc 1 ent1) ent1))
     (entupd blatt)
     (setq name2 (entnext name1)
    ent2 (entget name2))
     (entmod (subst (cons 1 (rtos chieudai 2 2)) (assoc 1 ent2) ent2))
     (entupd blatt)
     )
   (alert "doi tuong duoc chon khong phai la block attibute")
   )
 )

Chào bác Phamngoctukts,

Lisp của bác chưa giải quyêt vấn đề tạo boundary cho vùng hatch. Bản vẽ bạn Bachngoctung post lên hoàn toàn không có boundary của vùng hatch. Do vậy xài lisp của bác chưa được bác ạ.

Mặt khác như bạn ấy nói cái block của bạn ây đã được xác định, có tên hẳn hoi nên bác có thể xài luôn cái tên đó mà không cần kiểm tra mã DXF 66. Theo mình hiểu thì bạn ấy sẽ nhập vào block mới chứ không phải chỉnh sửa lại các block cũ bác ạ. Vậy nên bác có thể thay việc chọn block bằng việc insert block có tên do bạn ấy tự nhập thì hợp lý hơ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
Em có mấy bản cad (file sau khi được số hoá từ file jpg) nó có rất nhiều line vụn, nếu xoá thủ công thì lâu quá. Các bro giúp em viết 1 lisp để xoá tất cả các line, pline vụn ở trong bản cad được không? Cám ơn các bro trước! :)

Hề hề hề,

Bạn định nghĩa thế nào là line vụn và pline vụn ????

Tốt nhất hãy post cái bản vẽ ấy lên và cho một hình ảnh ví dụ sau khi xóa các line vụn mà bạn nói. Không phải ai cũng rành cái công việc của bạn nên hãy trình bày vấn đề thật rõ ràng bạn 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
Em dùng lệnh trong Hatch(Em kích vào đối tượng Hatch và sử dùng lệnh Recreateboundary ) để tạo ra đường bo sau đó em dùng lisp nối các đường line lại với nhau thôi.Em kích vào đối tượng Hatch và sử dùng lệnh Recreateboundary.

Hề hề hề,

Thằng CAD2004 của mình chả thấy có lệnh recreateboundary bác ạ, tệ quá.

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

Vừa hay, mới vừa viết xong Code cho Út. Tuy nhiên, không hiểu sao Lisp chạy lần đầu tiên thì không có kết quả. Chạy lần thứ hai trở đi thì OK

Út hãy thử với Code này :

(defun c:xkl(/ doc ss Lptext Lpxtext Ltt sset st fname i team)
 (setq doc (vla-get-activedocument (vlax-get-acad-object))
st (getint "\n So Text tren 1 hang :"))
 (setq ss (ssget '((0 . "TEXT"))) Lptext '() Lpxtext '() Ltt '() i 0
sset (vla-get-activeselectionset doc))
 (vlax-for x sset
   (setq Lptext (cons (cons  (vlax-get x 'InsertionPoint)
			 (vlax-get x 'Textstring)
		) Lptext))
 )
 (setq Lptext (vl-sort Lptext '(lambda (x y) (> (cadar x) (cadar y)))))
 (Repeat (fix  (/ (length Lptext) st))
   	   (setq Ltt (removeL (* st i) (1- (* st (1+ i))) Lptext))
  (setq Lpxtext (append Lpxtext (list Ltt)))
  (setq i (1+ i))
   )
 (if (setq fName (getfiled "Chon file" (getvar "dwgprefix") "txt" 1))
   (progn
     (setq fName (open fName "a"))
     (foreach x Lpxtext
(setq team "")
(foreach y x
    (setq team (strcat team "  " (cdr y)))
)
(write-line team fName)
      )
     )
     (close fName))
 (vla-delete sset)	
 (princ)
 )
;;;;;;;;;;
(defun removeL(d c L)
(reverse
 (member (nth c L)
 	(reverse (member (nth d L) L))
 )
)
)

Xin nhờ các anh giúp cho Lisp chon text trên Cad xuất ra file text hoặc Excel.

* Lisp yêu cầu xác nhận số text cần xuất ra hàng ngang Ví dụ : ( số text trên 1 hàng là 5 ) 1.23 2.35 3.21 3.25 3.25

ta chọn các text đúng với số khống chế 5 như trên của một hàng ( nếu có trường hợp trong một hàng số lần thứ 3 không có dử liệu ta chỉ chọn ngoài màn hình, thì có bỏ qua một ô . Ví dụ: 1.23 2.35 -- 3.25 3.25 ), khi hết dử liệu của hàng thì lisp hỏi nhập hàng tiếp nủa không ?

Nhấn Enter chọn nhập tiếp hàng 2, như vậy chọn tiếp...n

Khi kết thúc nhấn enter, enter thì xuất các số liệu text ra file text theo tên của file Cad theo số hàng n , có 5 cột

** PS: Lisp yêu cầu xác nhận số xuất ra cột dọc

ta chọn các text cần xuất ra cột , lisp hỏi nhập để xuất ra cột tiếp nủa không ?

Nhấn Enter chọn nhập tiếp để xuất ra cột 2, như vậy chọn tiếp...đến n cột

Khi kết thúc nhấn enter, enter thì xuất các số liệu text ra file text theo tên của file Cad theo số n cột.

Vì một lý do ta dừng khi kết thức nhập theo hàng hay cột mà dử liệu cò phải nhập tiếp, khi nhập tiếp thì số liệu nhập sau sẻ được thêm vào trong file nó và được nối tiếp.

Rất mong được các anh giúp. Cám ơn

Chỉnh sửa theo khaosat2009

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ạn phép bác Tue_NV, mình sử dụng lisp của bác bổ sung thêm phần ghi lại text mới vào vị trí gần đúng với text cũ cho bạn ceddtu . Việc ghi lại cho hoàn toàn chính xác là vấn đề khá khó chịu nên mình chỉ dừng ở đây. Lý do là do số lượng các ký tự khá khác nhau và khoảng cách giữa các ký tự cũng hoàn toàn không giống nhau. Mình đã tận dụng đến thông số width factor nhưng chỉ đạt gần đúng. Hy vọng bạn ceddtu hài lòng.

(defun c:tchu(/ L pat ents i2 i3 i str str2 C1 C2 C3)
(setq pat '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "." ","))
(setq ents (acet-ss-to-list (ssget '((0 . "TEXT") (1 . "* = #*"))))
L '() i2 nil)

(foreach y ents
(setq x (cdr (assoc 1 (entget y))))
(setq i 1 L1 "" L2 "")
(while ((setq str (substr x (setq i (1+ i)) 3))
(if (= str " = ") (progn
(setq i2 (+ i 2))
(while ((if (vl-position (setq str2 (substr x (setq i2 (1+ i2)) 1)) pat)
(setq L1 (strcat L1 str2) i3 i2)
(setq i2 (strlen x))
)
)
) )
)
(setq C1 (substr x 1 (- i3 (strlen L1)))
C2 (substr x (1+ (strlen C1)) (strlen L1))
C3 (substr x (1+ i3) (- i2 i3))
)
;;;;;;(alert (strcat C1 "\n" C2 "\n" C3))
(setq els (entget y)
       b (cdr (assoc 41 els))
       p1 (cdr (assoc 10 els))
       p2 (list (+ (car p1) (* b h 0.9 (1+ (strlen C1)))) (cadr p1))
       p3 (list (+ (car p2) (* b h 0.9 (1+ (strlen L1)))) (cadr p2))
       h (cdr (assoc 40 els))
       st (cdr (assoc 7 els))
       els (subst (cons 1 C1) (assoc 1 els) els)
)
(entmod els)
(entmake
(list (cons 0 "text") (cons 10 p2) (cons 1 C2) (cons 62 3) (cons 7 st) (cons 40 h) (cons 41 b ))
)
(entmake
(list (cons 0 "text") (cons 10 p3) (cons 1 C3) (cons 62 2) (cons 7 st) (cons 40 h) (cons 41 b ))
)
)

)

 

@ Bác Tue_NV: Tiện đây bác cho hỏi luôn cái vụ ký tự # là thay cho các chữ số hử bác??? Mình lọ mọ mà chả tìm thấy chỗ nào nói về cách sử dụng các ký tự như vậy trong lisp cả bác ạ. Nếu có tài liệu, bác post lên giùm cho anh em được mót với.....

Em đang ở quê và mới lên quán NET, không có CAD ở đây nên chưa upload hình vẽ cụ thể cho bác được

Bác xem ở trong hàm WCMATCH nhé. Nó có đầy đủ cả đấy

Em có đọc sơ qua Lisp của bác bổ sung thêm vào trong Lisp của Tue_NV.

Tue_NV nghĩ rằng bác cứ Copy Text gốc ra làm 3 cái tại đúng vị trí của nó

- Cái đầu thay nội dung của chuỗi C1

- Cái thứ 2 thay nội dung của chuỗi C2. Move cái thứ 2 : 1 đoạn = "chiều dài chuỗi C1"

- Cái thứ 3 thay nội dung của chuỗi C3. Move cái thứ 3 : 1 đoạn = "chiều dài chuỗi C1+C2"

- Xoá cái text gốc đi

=> Thế là được

(Hy vọng bác Bình hiểu cái ý của Tue_NV trong ý "chiều dài chuỗi C1"

 

@khaosat : Lisp trên là của Tue_NV viết. Nếu bạn chịu khó chờ, mình sẽ giúp cho bạn

  • 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×