conghoa
-
Số lượng nội dung
563 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
14
Bài đăng được đăng bởi conghoa
-
-
Chào các bạn, mình có vấn đề này mong các bạn giúp đỡ.
Hiện tại mình có một bản vẽ với rất nhiều đoạn thẳng, nhiệm vụ của mình là phải đánh ký hiệu theo thứ tự (A01, A02 ... AN) cho các đoạn thẳng đó và ghi kích thước cho các đoạn thẳng đó. Các đoạn thẳng có kích thước bằng nhau sẽ là cùng 1 ký hiệu, mình muốn các bạn giúp mình một lisp để rút ngắn thời gian làm công việc này.
Mình xin mô tả lisp như sau:
- Chạy lisp
+ Lisp yêu cầu chọn các đoạn thẳng cần ghi ký hiệu
- Người dùng chọn (có thể chọn kích từng đoạn, hoặc và gom tất cả)
+ Lisp yêu cầu chọn block att điển hình để thực hiện lệnh (block att này mình đã làm trong file đính kèm)
- Người dùng chọn block điển hình
+ Lisp yêu cầu nhập ký hiệu bắt đầu (ví dụ: A01 hoặc B04)
- Người dùng điền ký hiệu
+ Lisp sẽ copy block điển hình (theo điểm chèn block) vào giữa đoạn thẳng và thực hiện việc ghi ký hiệu và độ dài của các đoạn thẳng được chọn vào block att đó. Lưu ý là các đoạn thẳng có độ dài bằng nhau thì sẽ có cùng ký hiệu và dựa vào ký hiện bắt đầu do người dùng chọn để tăng thứ tự cho các đoạn thẳng tiếp theo.
Kết thúc lisp sau khi đã ghi hết các đoạn thẳng.
file mẫu:
http://www.mediafire.com/file/xk49d64p284c672/Vidu.dwg
Cảm ơn các bạn trước nhé.
Trân trọng! -
Cám ơn Conghoa.
Ý của tôi là có cách nào sửa block ban đầu để khi mình thay đổi thuộc tính thì các kích thước hình học thay đổi theo.
Em sửa cho bác rồi đó, bác đã test chưa?
-
Bác Gia_bach dùng thử cái block này xem được không
http://www.mediafire.com/file/448bnmsb6lm57pa/DynamicBlock.dwg
có thể lúc tạo block kia bị lỗi gì đó
-
Bạn download lại lisp này xem
http://www.mediafire.com/download/0nz637j84fecau1/ttcm_matchprop+text.lsp
- 1
-
@Colombus Bạn thử dùng lisp này xem. Nó như một dạng Matchprop text, Bạn có thể chọn copy text từ Dim, text, att, MText đến 1 text có sẵn mà bạn muốn.
Chạy lisp rồi bạn chọn Pair-wise nhé.
;;;Realization {Smirnoff}
;;; TTCM - Text to Text copy whith Matchprop. Copy text from DIMENSION, TEXT,
;;;MTEXT, ATTRIB, ATTDEF, ACAD_TABLE to one
(defun c:ttcm (/ actDoc vlaObj sObj sText curObj oldForm
oType oldMode conFlag errFlag *error* prop)
(vl-load-com)
(setq actDoc(vla-get-ActiveDocument
(vlax-get-acad-object)))
(vla-StartUndoMark actDoc)
(defun TTC_Paste(pasteStr / nslLst vlaObj hitPt
hitRes Row Column)
(setq errFlag nil)
(if
(setq nslLst(nentsel "\nPaste text >"))
(progn
(cond
(
(and
(= 4(length nslLst))
(= "DIMENSION"(cdr(assoc 0(entget(car(last nslLst))))))
); end and
(setq vlaObj
(vlax-ename->vla-object
(cdr(assoc -1(entget(car(last nslLst)))))))
(if
(vl-catch-all-error-p
(vl-catch-all-apply
'vla-put-TextOverride(list vlaObj pasteStr)))
(progn
(princ "\n Can't paste. Object may be on locked layer. ")
(setq errFlag T)
); end progn
); end if
); end condition #1
(
(and
(= 4(length nslLst))
(= "ACAD_TABLE"(cdr(assoc 0(entget(car(last nslLst))))))
); end and
(setq vlaObj
(vlax-ename->vla-object
(cdr(assoc -1(entget(car(last nslLst))))))
hitPt(vlax-3D-Point(trans(cadr nslLst)1 0))
hitRes(vla-HitTest vlaObj hitPt
(vlax-3D-Point '(0.0 0.0 1.0)) 'Row 'Column)
); end setq
(if(= :vlax-true hitRes)
(progn
(if
(vl-catch-all-error-p
(vl-catch-all-apply
'vla-SetText(list vlaObj Row Column pasteStr)))
(progn
(princ "\n Can't paste. Object may be on locked layer. ")
(setq errFlag T)
); end progn
); end if
); end progn
); end if
); end condition # 2
(
(and
(= 4(length nslLst))
(= "INSERT"(cdr(assoc 0(entget(car(last nslLst))))))
); end and
(princ "\nCan't paste to block's DText or MText. Select Attribute ")
(setq errFlag T)
); end condition #3
(
(and
(= 2(length nslLst))
(member(cdr(assoc 0(entget(car nslLst))))
'("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))
); end and
(setq vlaObj
(vlax-ename->vla-object(car nslLst)))
(if
(vl-catch-all-error-p
(vl-catch-all-apply
'vla-put-TextString(list vlaObj pasteStr)))
(progn
(princ "\nError. Can't pase text. ")
(setq errFlag T)
); end progn
); end if
); end condition #4
(T
(princ "\nCan't paste. Invalid object. ")
(setq errFlag T)
); end condition #5
); end cond
(if (and (null errFlag)
(= (type vlaObj) 'VLA-OBJECT))
(mapcar '(lambda (x y) (vlax-put-property vlaObj x y))
'(Linetype LineWeight Color Layer)
prop
)
)
T
); end progn
nil
); end if
); end of TTC_Paste
(defun TTC_MText_Clear(Mtext / Text Str)
(setq Text "")
(while(/= Mtext "")
(cond
((wcmatch
(strcase
(setq Str
(substr Mtext 1 2)))
"\\[\\{}`~]")
(setq Mtext(substr Mtext 3)
Text(strcat Text Str)
); end setq
); end condition #1
((wcmatch(substr Mtext 1 1) "[{}]")
(setq Mtext
(substr Mtext 2))
); end condition #2
(
(and
(wcmatch
(strcase
(substr Mtext 1 2)) "\\P")
(/=(substr Mtext 3 1) " ")
); end and
(setq Mtext (substr Mtext 3)
Text (strcat Text " ")
); end setq
); end condition #3
((wcmatch
(strcase
(substr Mtext 1 2)) "\\[LOP]")
(setq Mtext(substr Mtext 3))
); end condition #4
((wcmatch
(strcase
(substr Mtext 1 2)) "\\[ACFHQTW]")
(setq Mtext
(substr Mtext
(+ 2
(vl-string-search ";" Mtext))))
); end condition #5
((wcmatch
(strcase (substr Mtext 1 2)) "\\S")
(setq Str(substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
Text(strcat Text (vl-string-translate "#^\\" " " Str))
Mtext(substr Mtext (+ 4 (strlen Str)))
); end setq
(print Str)
); end condition #6
(T
(setq Text(strcat Text(substr Mtext 1 1))
Mtext (substr Mtext 2)
)
); end condition #7
); end cond
); end while
Text
); end of TTC_MText_Clear
(defun TTC_Copy (/ sObj sText tType actDoc)
(if
(and
(setq sObj(car(nentsel "\nCopy text... ")))
(member(setq tType(cdr(assoc 0(entget sObj))))
'("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))
); end and
(progn
(setq actDoc(vla-get-ActiveDocument
(vlax-get-Acad-object))
sText(vla-get-TextString
(vlax-ename->vla-object sObj))
); end setq
(if(= tType "MTEXT")
(setq sText(TTC_MText_Clear sText))
); end if
); end progn
); end if
(setq prop (mapcar '(lambda (x)
(vlax-get-property (vlax-ename->vla-object sObj) x))
'(Linetype LineWeight Color Layer)
)
)
sText
); end of TTC_Copy
(defun CCT_Str_Echo(paseStr / comStr)
(if(< 20(strlen paseStr))
(setq comStr
(strcat
(substr paseStr 1 17)"..."))
(setq comStr paseStr)
); end if
(princ
(strcat "\nText = \"" comStr "\""))
(princ)
); end of CCT_Str_Echo
(defun *error*(msg)
(vla-EndUndoMark
(vla-get-ActiveDocument
(vlax-get-acad-object)))
(princ "\nQuit TTCM")
(princ)
); end of *error*
(if(not ttc:Mode)(setq ttc:Mode "Multiple"))
(initget "Multiple Pair-wise")
(setq oldMode ttc:Mode
ttc:Mode
(getkword
(strcat "\nSpecify mode [Multiple/Pair-wise] <" ttc:Mode ">: "))
conFlag T
paseStr ""
); end setq
(if(null ttc:Mode)(setq ttc:Mode oldMode))
(if(= ttc:Mode "Multiple")
(progn
(if(and(setq paseStr(TTC_Copy))conFlag)
(progn
(CCT_Str_Echo paseStr)
(while(setq conFlag(TTC_Paste paseStr))T
); end while
); end progn
); end if
); end progn
(progn
(while
(and conFlag paseStr)
(setq paseStr(TTC_Copy))
(if(and paseStr conFlag)
(progn
(CCT_Str_Echo paseStr)
(setq errFlag T)
(while errFlag
(setq conFlag(TTC_Paste paseStr))
);end while
); end progn
); end if
); end while
); end progn
); end if
(vla-EndUndoMark actDoc)
(princ "\nQuit TTCM")
(princ)
); end c:ttc
(princ "\n\t TTCM - Text to Text copy with matchprop.")
(princ "\nCopy text from DIMENSION, TEXT, MTEXT, ATTRIB, ATTDEF, ACAD_TABLE to one")
- 1
-
Hình như mình đã từng làm cái #123 rồi.
@Quocmanh04tt mình có xem phần lớn các lisp bạn post và cái mà bạn bảo hình như đó lại là tách nhiều bản vẽ trong layout ra làm thành các file riêng thì phải.
Cái mình post bên trên là trong 1 layout có nhiều viewport, lisp sẽ tách các viewport đó (đã thiết lập việc freeze layer) ra thành các layout riêng vẫn giữ nguyên các thiết lập của viewport đó.
Các bác giúp em nhé!
-
@KangKung bác giúp em cái này được không? Nội dung có post trong bài dưới
Em xin trích lại nội dung:
"Chào các bạn, Hiện tại mình có khá nhiều bản vẽ mà trong layout lại có nhiều khung Mview. Mình có tìm trên diễn đàn mà chưa có cách nào để tách nhanh khung mview thành các Layout riêng biệt mà vẫn giữ nguyên các thiết lập freeze của mview đó. Các bạn giúp mình viết một lisp sau nhé: 1. Chạy lisp 2. Lisp yêu cầu người dùng chọn các khung mview cần tách 3. Người dùng chọn các khung mview 4. Lisp yêu cầu điền tên layout mới được tạo (ví dụ đặt tên là KH, thì các layout được tạo sẽ là KH1, KH2... đến khi hết khung Mview thì thôi) 5. Kết thúc lisp, lisp sẽ tách theo yêu cầu Ghi chú: các layout mới được tạo từ các khung mview vẫn giữ nguyên các thiết lập về việc freeze layer của mview gốc. Cảm ơn các bạn nhiều! File ví dụ của mình: - Trong file có layout Test có nhiều khung Mview, và các layout KH_1 ..v.v. là layout mong muốn khi thực hiện lisp http://www.cadviet.com/upfiles/6/1969_drawing1.dwg "
Cảm ơn bác trước nhé!
-
-
em có 1 số bản vẽ có đối tượng ATT trong block dùng field để link. khi copy sang bản vẽ khác bị lỗi ########### nên muốn có lisp convert filed to text. Hiệu lực của lisp này có thể tác động lên đối tượng text thường, mtext, leader, ATT trong block. thanks.
cấu trúc lệnh:
gõ lệnh abc...
chọn đối tượng (có thể là text, mtext, att block... hoặc các đối tượng có field)
enter để convert.
http://www.cadviet.com/upfiles/6/1969_convert_field_to_text.lsp
Bạn dùng lệnh CFTSEL là được như mong muốn, hoặc CFTAll là chọn toàn bộ
- 2
-
Báo lỗi:
Command: ; error: bad argument type: stringp nil
- 1
-
Chào các bạn,
Hiện tại mình có khá nhiều bản vẽ mà trong layout lại có nhiều khung Mview. Mình có tìm trên diễn đàn mà chưa có cách nào để tách nhanh khung mview thành các Layout riêng biệt mà vẫn giữ nguyên các thiết lập freeze của mview đó.
Các bạn giúp mình viết một lisp sau nhé:
1. Chạy lisp
2. Lisp yêu cầu người dùng chọn các khung mview cần tách
3. Người dùng chọn các khung mview
4. Lisp yêu cầu điền tên layout mới được tạo (ví dụ đặt tên là KH, thì các layout được tạo sẽ là KH1, KH2... đến khi hết khung Mview thì thôi)
5. Kết thúc lisp
Ghi chú: các layout mới được tạo từ các khung mview vẫn giữ nguyên các thiết lập về việc freeze layer của mview gốc.
Cảm ơn các bạn nhiều!
File ví dụ của mình:
- Trong file có layout Test có nhiều khung Mview, và các layout KH_1 ..v.v. là layout mong muốn khi thực hiện lisp
-
không bạn ơi, ý mình là cái lấy cái seri để từ cái seri đó chủ thớt cho mình key ở đâu cơ
Mình dự là bạn ấy có một cái lisp get key riêng, mọi người cấp serial thì bạn ấy add vô cái lisp đó để ra key :)
- 1
-
File của bạn bị lỗi rồi, ko mở dc
- 1
-
Cảm ơn Anh nhiều, Anh có thể chỉ em cách sửa lỗi đó không ạ, tại em thường xuyên lên mạng lấy file của nhà sản xuất để vẽ lại vào thiết bị của mình. mong anh chỉ giáo giúp em.
File này mở bằng 2017 bình thường thôi bạn, cứ bấm là nó tự mở :D
-
Bạn search lisp đặt lại điểm chèn cho Block đó vào tâm Block giống như cái Block RMV của bạn là được
- 1
-
-
Dự là các thánh thiếu file xref
-
Cách của Hai lúa có vẻ hơi thủ công hơn cách của ketxu :)
- 1
-
Tặng bạn cái này cùng với ACE nào cần (Còn mới nóng): :D
http://www.cadviet.com/upfiles/5/141736_khbv.rar
Trong đó: (Lệnh KHBV)
+ Pick : để lấy tên Tag của block thuộc tính.
+ Auto: Số thứ tự tự động (Tác dung với trường hợp bạn thay đổi STT bắt đầu, muốn khôi phục lại) - Mặc định là tự động.
+ Chức năng sort:
0 - None ... Cái nào chọn trước thì được trước ...
1,2,3,4 Có ghi rõ ràng ... (Nguyên tắc luôn từ trái qua phải).
P/s Có thể ứng dụng cho các loại att-block khác, không nhất thiết phải là khung tên.
Thank bạn quocmanh04tt!
Bạn có thể nâng cấp nó để áp dụng được cho text thường nữa được không?
-
@Quocmanh04tt cho mình hỏi chút, với bản vẽ có nhiều layout, trong mỗi layout lại có nhiều khung tên thì QPL có in được luôn không bạn?
-
Bác có thể xem qua cái này :)
-
@Quocmanh04tt sao mình vẫn không thể nào chạy được lisp nhỉ, điền key xong đánh lại lệnh nó vẫn hiện lên bảng bắt điền lại key :)
-
:D, thì lúc add lisp nhập key rồi mà lúc đánh lệnh nó vẫn hiện bảng bắt nhập key, chẳng hiện cái gì khác :D
-
Mình test thử trên 2014 thì ko bik lỗi nhưng khi chạy lại lện QPL thì nó lại bắt điền Key :D
[Request] Tự Động Ghi Chú Đoạn Thẳng Theo Thứ Tự Tăng Dần
trong AutoLisp
Đã đăng · Trả lời báo cáo
wao, đoạn code ngắn mà làm được khối lượng công việc quá nhiều bác ạ. Thanks bác Tue_NV nhé!
Bác cho em hỏi thêm chút, bác có thể chỉnh giúp cho số thứ tự của Block sẽ hiện theo thứ tự người dùng chọn đường Line được không? Vì cái bác đang viết là số thứ tự sẽ được tăng dần theo chiều dài của Line thì phải.
Trân trọng!