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

conghoa

Thành viên
  • 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


  1. 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!


  2. 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!



  3. @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")

    • Vote tăng 1

  4. 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é!


  5. @KangKung bác giúp em cái này được không? Nội dung có post trong bài dưới

     

    http://www.cadviet.com/forum/topic/164120-yeu-cau-tach-nhieu-mview-trong-1-layout-thanh-cach-layout-rieng-biet/

     

    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é!


  6. 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ộ

    • Vote tăng 2

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

    http://www.cadviet.com/upfiles/6/1969_drawing1.dwg


  8. 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

    141736_khbv.jpg

    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?

×