Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

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


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#2381 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 27 October 2010 - 11:29 PM

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ề.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2382 VUVUZELA

VUVUZELA

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 210 Bài viết
Điểm đánh giá: 97 (tàm tạm)

Đã gửi 28 October 2010 - 08:58 AM

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
  • 1

Hệ thống Liên Kết, Thiết Kế Tự Động

ttps://www.facebook...etThietKeTuDong


#2383 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 106 (tàm tạm)

Đã gửi 28 October 2010 - 09:16 AM

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!
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#2384 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 28 October 2010 - 10:46 AM

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
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#2385 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 28 October 2010 - 11:38 AM

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.
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#2386 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 28 October 2010 - 11:51 AM

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
  • 0

#2387 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 28 October 2010 - 12:07 PM

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ề....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2388 ceddtu

ceddtu

    biết vẽ spline

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

Đã gửi 28 October 2010 - 11:32 PM

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.c..._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
  • 0
Đời vắng mẹ hiền không phụ nữ.
Anh hùng thi sĩ hỏi còn đâu !

#2389 ceddtu

ceddtu

    biết vẽ spline

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

Đã gửi 29 October 2010 - 12:08 AM

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
  • 0
Đời vắng mẹ hiền không phụ nữ.
Anh hùng thi sĩ hỏi còn đâu !

#2390 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 October 2010 - 07:10 AM

http://www.cadviet.c..._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 (< i (strlen x))
(setq str (substr x (setq i (1+ i)) 3))
(if (= str " = ") (progn
(setq i2 (+ i 2))
(while (< i2 (strlen x))
(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))
)
)

  • 0

#2391 vtd_xd

vtd_xd

    biết vẽ circle

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

Đã gửi 29 October 2010 - 08:40 AM

Chào các bạn
Bạn nào có thể sửa giúp mình lisp "linkT" dùng được cho cả đối tượng Attribute Block.
Xin cảm ơn bác bạn trước nhé

Hình đã gửi

Đây là file ví dụ của mình: http://www.cadviet.c...3/cadviet_3.dwg
  • 0
Chuc vui ve

#2392 bachngoctung

bachngoctung

    biết lệnh copy

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

Đã gửi 29 October 2010 - 03:00 PM

- 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.c...advietcom_2.dwg
  • 0

#2393 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 29 October 2010 - 03:44 PM

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

  • 2
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#2394 ptgiang

ptgiang

    Chưa sử dụng CAD

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

Đã gửi 29 October 2010 - 04:56 PM

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! :)
  • 0

#2395 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 October 2010 - 06:41 PM

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 (< i (strlen x))
(setq str (substr x (setq i (1+ i)) 3))
(if (= str " = ") (progn
(setq i2 (+ i 2))
(while (< i2 (strlen x))
(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.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2396 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 October 2010 - 06:53 PM

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.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2397 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 October 2010 - 06:56 PM

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é.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2398 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 October 2010 - 07:29 PM

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á.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2399 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 29 October 2010 - 08:47 PM

[quote name='Tue_NV' date='May 23 2010, 9:58' post='96076']
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

Bài viết đã được chỉnh sửa nội dung bởi khaosat2009: 30 October 2010 - 06:24 AM

  • 0

#2400 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 October 2010 - 09:20 PM

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 (< i (strlen x))
(setq str (substr x (setq i (1+ i)) 3))
(if (= str " = ") (progn
(setq i2 (+ i 2))
(while (< i2 (strlen x))
(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
  • 3