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

Duong Nhat Duy

Thành viên
  • Số lượng nội dung

    550
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    101

Bài đăng được đăng bởi Duong Nhat Duy


  1. 14 phút trước, kninja đã nói:

    Cảm ơn bạn nhé, cho mình hỏi giờ mình muốn lấy diện tích bằng lệnh (DT1) sau dấu phẩy 3 chữ số thì điều chỉnh như thế nào ạ! 

    1 là bạn khai báo phần thập phân trong lệnh TL, 2 là bạn sửa trực tiếp code như hướng dẫn (sửa trực tiếp thì load lên nó mặc định là 3 số theo ý bạn)


  2. TEXTLAYER thì mình thử cad18 lại không phải là 1 biến, tóm lại khi bạn khám phá ra 1 biến nào đấy bị thay đổi theo bản vẽ, thì việc sửa lại rất đơn giản, chỉ cần vào bản vẽ không lỗi xem giá trị biến đó là gì sau đó sang bản lỗi sửa lại là xong.

    Lưu ý: 1 số biến ví dụ HPLAYER, sau khi nhập lệnh, cad nó thông báo là "use current", nhưng thực tế giá trị đúng nó lại là "." => Tổng quát nhất, hãy dùng lệnh: (getvar 'tenbien) (tenbien bất kỳ đặt sau dấu nháy đơn). Ngoài ra có thể đưa vào lisp theo ý muốn bằng cách dùng (setvar... như mình đã làm ở trên.


  3. 3 giờ trước, tannguyen291 đã nói:

    Mình đang nghiên cứu ra rồi nhé. sử dụng hàm (getpropertyvalue [ename] [property]) 

    property là string có dạng "AcDbDynBlockProperty" + "distance..."

    nếu có giá trị là hiện nếu error là ẩn. 

    đi kèm với cặp lệnh vl-catch-all-error-p vl-catch-all-apply thì ok luôn.

    
    (defun c:test (/ ent lst lstcheck lstparavisible )
      (setq 
        ent (car (entsel))
        lst (LM:getdynprops (vlax-ename->vla-object ent))
        lst (vl-remove-if-not '(lambda (x) (eq 'REAL (type (cdr x)))) lst)
        lst (mapcar '(lambda (x) (strcat "AcDbDynBlockProperty" (car x)) ) lst)
        lstcheck (mapcar '(lambda (x) (vl-catch-all-apply 'getpropertyvalue (list ent x))) lst)
        lstparavisible (mapcar 
                         '(lambda (a b) 
                            (if (not (vl-catch-all-error-p b))
                              (cons (substr a 21) b)
                            )
                          )
                        lst lstcheck
                       )
      )
      (vl-remove nil lstparavisible)
    )
    
    (defun LM:getdynprops (blk)
      (mapcar '(lambda (x)
    	     (cons (vla-get-propertyname x) (vlax-get x 'value))
    	     )
    	  (vlax-invoke blk 'getdynamicblockproperties)
    	  )
      )
    4 giờ trước, snowman.hms đã nói:

    blocreference(insert) -> blockrecord -> xdict -> acad_evaluation_graph -> blockvisibilityparameter  (dxf 360) -> filter dxf 333 (*parameter)

    tham khảo bài viết của Gile: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/get-list-of-parameters-being-used-in-block-without-vla-vlax/m-p/8461420#M378276

    http://poleshchuk.spb.ru/cad/2009/tainypod08e.htm

    Tuyệt vời, cảm ơn các bác đã trợ giúp nhé !


  4. 2 giờ trước, huunhantvxdts đã nói:

    mình đã biết visible ở trạng thái nào rồi thì đặt điều kiện để lấy distance tương ứng.

    image.thumb.png.a4cde0484c46f9c6623e3028fd8537f6.png

    Tại e đưa ví dụ đơn giản thôi mà bác. Thực tế Block là do người dùng chọn, có thể có 5-10 trạng thái, và 1 Parameters có thể có ở 2 hoặc nhiều trạng thái khác nhau nữa

    • Like 1

  5. 54 phút trước, tannguyen291 đã nói:

    Mình không biết bạn DUY đang làm gì nhưng phải dùng đến lisp kiểu này cho thấy phải thực hiện trên rất nhiều đối tượng chứ không phải 1. bạn không thể nentsel liên tục được. 

    việc explode cũng chỉ làm với 1 block mẫu để lấy danh sách thông tin. sau đó cứ thế chạy lisp lấy độ dài.

    Mình đang định thống kê các giá trị Parameters của nhiều Block ấy bạn, như lệnh ATTOUT của cad nhưng là cho block động á. Cơ bản dựa vào mấy hàm của Leemac thì thống kê được, nhưng nó sẽ thống kê hết Parameters của 1 Block, khi gặp Block có nhiều trạng thái, nó vẫn thống kê Parameters ẩn, cái này gây khó khăn cho các thao tác tính toán trong excel về sau.


  6. 15 giờ trước, limfx đã nói:

    Hy vọng lần này đúng ý anh!

    image.png.cbe94ec623cdc08729e6b4a93eccd8ac.png

    image.png.60822c41aed39a755f02ff885fc7d472.png
    (setq blk (vlax-ename->vla-object (car (entsel))))
    (setq prptext "Distance")
    (if
            (and
                (vlax-property-available-p blk 'effectivename)
                (setq blkk (vla-item (vla-get-blocks (vla-get-document blk)) (vla-get-effectivename blk)))
                (= :vlax-true (vla-get-isdynamicblock blk))
                (= :vlax-true (vla-get-hasextensiondictionary blk))
                (setq vis
                    (vl-some
                       '(lambda ( pair )
                            (if (and (= 360 (car pair)) (= "BLOCKVISIBILITYPARAMETER" (cdr (assoc 0 (entget (cdr pair)))))) (cdr pair)))
                        (dictsearch (vlax-vla-object->ename (vla-getextensiondictionary blkk)) "ACAD_ENHANCEDBLOCK")) )
            )
            (setq visibilityparametername (strcase (cdr (assoc 301 (entget vis)))))
    )
    (setq state (vl-some '(lambda ( x ) (if (= visibilityparametername (strcase (vla-get-propertyname x))) (vlax-get x 'value))) (vlax-invoke blk 'getdynamicblockproperties)))


    (setq prp (strcase (strcat prptext (StringSliptLastNumber state))))

    (setq prpval (vl-some '(lambda ( x ) (if (= prp (strcase (vla-get-propertyname x))) (vlax-get x 'value))) (vlax-invoke blk 'getdynamicblockproperties)))
          
    (setq lst (list state prpval))

    (defun StringSliptLastNumber (str)
      (setq num "")
      (setq i (strlen str))
      (while (and (> i 0) (member (substr str i 1) '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")))
        (setq num (strcat (substr str i 1) num))
        (setq i (1- i))
      )
      num 
    )

    Mình hỏi ý không phải chứ bạn đang code = chatGPT hả ??? Hàm này nó lấy cái số "1" trong cái tên "State1" rồi lắp vào chữ "Distance" mà bạn ???


  7. 3 giờ trước, limfx đã nói:

    Hy vọng cái hàm này hợp với ý của Anh!

     

    (setq blo (vlax-ename->vla-object (car (entsel))))
    (getdynamicblockproperties_limfx blo)
    (defun getdynamicblockproperties_limfx (blo)
      (setq props (vlax-invoke blo 'getdynamicblockproperties))
      (mapcar
         '(lambda (prop)
            (print (cons (vla-get-propertyname prop) (vlax-get prop 'value)))
          )
          (vl-remove-if-not '(lambda (x) (and (vlax-get x 'show) (vlax-get x 'value))) props )
       )
    );end

     

    Sao mình test thấy nó vẫn hiện cả 2 distance bạn ơi ?


  8. Mọi người cho mình hỏi về Block động.

    Mình có hàm thống kê Parameters của Leemac:

    (defun LM:getdynprops (blk)
      (mapcar '(lambda (x)
    	     (cons (vla-get-propertyname x) (vlax-get x 'value))
    	     )
    	  (vlax-invoke blk 'getdynamicblockproperties)
    	  )
      )
    ;(LM:getdynprops (vlax-ename->vla-object (car (entsel))))

    Nhưng khi áp dụng cho Block có nhiều trạng thái, ví dụ: Drawing1.dwgDistance1 nằm trong State1, Distance2 nằm trong State2, thì hàm trên vẫn thống kê cả 2 cái Distance.

    Vậy cho mình hỏi có cách nào nhận biết Parameter nào đang hiển thị trong trạng thái nào không nhỉ ?

    Cảm ơn các bạn !


  9. Hàm lấy tên Block nên sửa thành: (vì có thể lỗi như bác Cường nói)

    (setq BN (vla-get-effectivename (vlax-ename->vla-object (car (entsel "\nChon Block muon chen:")))))

    Vì lisp dùng command insert nên cần thêm bật tắt bắt điểm

    (setq snap (getvar "OSMODE"))
    (setq otho (getvar "ORTHOMODE"))
    (setvar "OSMODE" 0)
    (setvar "ORTHOMODE" 0)
    ;;;
    (command "INSERT" ......)
    ;;;
    (setvar "OSMODE" snap)
    (setvar "ORTHOMODE" otho)

     


  10. 4 giờ trước, amateurday đã nói:

    Tội lỗi, nhưng phải tranh thủ lúc bác ấy chưa thương mại hóa mà trải nghiệm. Hề hề.

    WXP1AB89NYC5

    Mà không biết mã máy tạo kiểu gì mà sao định dạng nó lại mỗi người mỗi khác nhau thế bác nhỉ?

    Cảm ơn bác nhé.

    Mình đã add mã của bạn r nhé.

    Mã máy là số seri của ổ cứng đó b, cái này b phải hỏi mấy a làm ổ cứng chứ mình thì chịu :v

    • Vote tăng 2

  11. Gửi đến các bạn 1 lisp Dim tự động, có thể dim hàng loạt các đối tượng theo các yêu cầu đề bài khác nhau (ví dụ: dim qua giao cắt, block; dim bán kính, vát góc; ...)

    Tên lệnh:

         TL - Thiết lập (Dimstyle, layer, khoảng cách chữ đến chân dim, ...)

         TLD - Thiết lập dim tự động theo layer

         DA1 - Dim chiều dài các đối tượng riêng lẻ

         DA2 - Dim chiều dài các đối tượng qua giao điểm, điểm đặt Block

         DA3 - Dim chiều dài các đối tượng qua các điểm tùy chọn

         DQ1 - Dim chiều dài giữa 2 đầu đối tượng (tổng chiều dài từng đối tượng)

         DQ2 - Dim chiều dài giữa 2 đầu đối tượng (tổng chiều dài từng đối tượng)

         DB1 - Dim khoảng cách giữa các Block

         VG - Dim vát góc

         DAR1 - Dim chiều dài cung

         DRA1 - Dim bán kính cung

         DLI1 - Dim Linear qua các giao điểm giữa 2 điểm chọn

         DAL1 - Dim Aligned qua các giao điểm giữa 2 điểm chọn

         DCD - Dim khoảng cách giữa 2 điểm chọn

         ?? - Hiển thị bảng tên lệnh

     

    Hướng dẫn chi tiết các lệnh:

    image.thumb.png.660b75d5f5efae9852b22a52d6676ddc.png

     

    Ví dụ minh họa:

    - TLD: Thiết lập dim tự động: style, layer, tiền tố, hậu tố của dim tùy biến theo layer của các đối tượng cần dim

    TLD.gif.244c16cb453e791ae95f42e01672cb69.gif

     

    - DA1: Dim chiều dài các đối tượng riêng lẻ (Line, Pline, Arc), cong dim cong, thẳng dim thẳng

    DA1.png.e43a6e4ea17a1401b6a85b16771d3294.png

     

    - DA2: Dim chiều dài các đối tượng qua giao điểm, điểm đặt Block (ngoài ra dim tự động ngắt tại đỉnh pline)

    DA2.png.de120c36b8561d2001b9998c7f65a797.png

     

    - DA3: Dim chiều dài các đối tượng qua các điểm tùy chọn (vị trí ngắt dim có thể chọn 1 hoặc nhiều các option bên dưới)

    DA3.png.78f6721acc54acbd88fbe226cc95718a.png

     

    - DQ1, DQ2: Dim chiều dài giữa 2 đầu đối tượng (tổng chiều dài từng đối tượng). Lưu ý: ở ví dụ bên dưới, kiểu dim hiện hành là dim không có "Dim line 2" nên trông giống như mũi tên, bản chất vẫn là dim bình thường. Lệnh DQ2 có tác dụng đảo ngược hướng mũi tên này. Ngoài ra, nếu dùng các kiểu dim thông thường thì 2 lệnh này cho ra 1 kết quả như nhau.

    DQ1.png.9265e884401a80d1f1ceccb1124703aa.png

    DQ2.png.6c0148fad50a36eeca686d11a8656c2e.png

     

    - DB1: Dim khoảng cách giữa các Block. Có thể lựa chọn thứ tự từ trên xuống dưới, phải qua trái, thứ tự pick chọn,...

    DB1.png.b308f31d179cede1f6213b0c98b607b8.png

     

    - VG: Dim vát góc. Lưu ý nhập chiều dài vát góc tối đa trong lệnh TL, để tránh dim nhầm các vị trí không phải vát góc

    VG.png.11f9a1dd6e9a485a1cbb244e8e83cabd.png

     

    - DAR1: Dim chiều dài cung (dùng cho cả Arc và Pline có chứa cung)

    DAR1.png.15aa7b7d9f791214dc2efe347e78da4a.png

     

    - DRA1: Dim bán kính cung (dùng cho cả Arc và Pline có chứa cung). Lưu ý khai báo bán kính tối thiểu, tối đa trong lệnh TL

    DRA1.png.1b103e20767a966b0011fdcbbd0aaaf4.png

     

    - DLI1: Dim Linear qua các giao điểm giữa 2 điểm pick chọn

    DLI1.png.f7b9527961021046b86779eb004f039c.png

     

    - DAL1: Dim Aligned qua các giao điểm giữa 2 điểm pick chọn. Lưu ý: ở ví dụ bên dưới, muốn dim theo phương vuông góc với các đường màu xanh, ta bắt điểm vuông góc với nó là được

    DAL1.png.1714c466c052531035b069e300988bf7.png

     

    - DCD: Dim khoảng cách giữa 2 điểm pick chọn. Lệnh này thì đơn giản không có gì để mô tả :)). Lưu ý: có thể nhập khoảng cách điểm thứ 2 so với điểm thứ nhất tùy ý.

     

    Lưu ý:

    Lisp khá đồ sộ nên mình không share mã nguồn.

    Để sử dụng lisp các bạn vui lòng gửi Mã máy (thông báo hiện lên ngay sau khi load lisp), có thể gửi trên forum hoặc qua zalo mình: 0922161194.

    Mã máy mình add lên server là có thể dùng được ngay, ai gửi mã mà chưa thấy mình phản hồi thì thỉnh thoảng cứ load thử lại lisp, dùng được nghĩa là mình đã add rồi.

    Lisp cũng mới viết nên nhờ các bạn dùng và góp ý, mai kia hoàn chỉnh mới tính đến chuyện mua bán sau.

     

    File lisp:

    - v1.02 (29/04/2024): https://drive.google.com/drive/u/1/folders/1tAt7uRmllwFAd0UJf6hf-5FnzAI55IDA

     

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

    • Like 6
    • Vote tăng 3

  12. Bây giờ có 2 trường phái: 1 là những con người của quá khứ trung thành với cad07, 2 là những người đến từ tương lai, đầu năm 23 24 nhưng đã dùng cad 24 25 rồi :))).

    Mình thì ở giữa, từ khi cad nó lên đời xong tự nhiên thêm mấy cái biến ngớ ngẩn ví như TRIMSEXTENDMODE (mặc định là 1 chứ ko phải 0) thì mình ko còn quá hào hứng với cad nữa rồi, vẫn trung thành với cad18 và 20.

    • Like 1

  13. 15 giờ trước, quanghapham đã nói:

    ok bạn ơi, mình đang dùng cad 22 với 24 đều không được, thôi dùng cái đánh stt theo thứ tự tự chọn cũng được nhưng hơi lâu chút :V

    Theo các tiền bối mách bảo thì bạn hãy thử dùng lệnh LISPSYS, nhập 0, r khởi động lại cad xem có chạy được ko nhé. Cảm ơn các tiền bối nhé !

×