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

Tue_NV

Moderator
  • Số lượng nội dung

    4.260
  • Đã tham gia

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

  • Ngày trúng

    286

Bài đăng được đăng bởi Tue_NV


  1. Quick code:

    (defun c:dopl()
      (setq i 0)
      
      (if (setq e (car(entsel "\n Chon Pline : ")))
         (progn
           (setq obj (vlax-ename->vla-object e))
           (if (= 0 (vla-GetBulge obj i)) 
      (command "._dimlinear" "_non" (vlax-curve-getstartpoint e) "_non" (vlax-curve-getpointatparam e (1+ i))
       "_non" pause)
      (command "._dimarc" (vlax-curve-getpointatparam e (+ i 0.5)) "_non" pause)
           )
           (setq i (1+ i) ddat (cdr(assoc 10 (entget (entlast)))) dis (distance ddat (vlax-curve-getclosestpointto e ddat)))
           (Repeat (1- (fix (vlax-curve-getEndParam e)))
     (if (= 0 (vla-GetBulge obj i))
        (command "._dimlinear" "_non" (vlax-curve-getpointatparam e i) "_non" (vlax-curve-getpointatparam e (1+ i))
         "_non" (polar (vlax-curve-getpointatparam e (+ i 0.5)) (- (angle '(0 0 0) (vlax-curve-getFirstDeriv e (+ i 0.5))) (/ pi 2.0)) dis))
        (command "._dimarc" (vlax-curve-getpointatparam e (+ i 0.5))
         "_non" (polar (vlax-curve-getpointatparam e (+ i 0.5)) (- (angle '(0 0 0) (vlax-curve-getFirstDeriv e (+ i 0.5))) (/ pi 2.0)) dis))
              )
     (setq i (1+ i) ddat (cdr(assoc 10 (entget (entlast)))) )
           )
       )
       )
     )
    
    • Vote tăng 1

  2. Cái này có cái hay hơn các chương trình thống kê khác là làm trực tiếp trên cad, chỉ cần ED là được. Còn về việc dò tìm thì mình sẽ làm cái file mẫu gồm 25 loại thép để sẵn, copy ra mà ED. 25 loại thép thì dò cũng rất nhanh, và ứng dụng thống kê nào cũng phải dò cả mà. Cám ơn bạn đã góp ý

     

    Bạn xem thử chương trình sau :

    http://www.cadviet.com/forum/topic/71547-hoi-xin-lisp-ed-tu-tinh-toan-trong-block-dong/

     

    Ứng dụng này cũng chạy trên CAD, hoạt động trên cơ sở của lệnh ED, chỉ cần EDIT là tự động update, có thể tính toán phép tính trên kích thước thanh thép

    Có thể tạo ra hình dạng của thanh thép bất kỳ mà không cần phải DÒ. Thấy mẫu thép có sẵn thì lấy để làm, không có sẵn thì cơ động tạo ra mẫu hình dạng thép luôn, không cần đến thư viện mẫu thép

    Mình thấy có pm thống kê thép tạo thư viện hơn 100 loại thép. Dò cũng hơi mệt ^_^


  3. Mình chỉ thấy là cách thống kê giống như 1 số chương trình thống kê thép khác phải tạo ra nhiều kiểu thanh thép khác nhau

    Nếu thiếu kiểu thép trong thư viện thì phải đi tạo thêm, đến lúc thư viện nhiều quá phải đi dò, tìm đúng thì lấy, nếu dò không ra thì phải đi tạo thêm, mà cũng không biết chừng thanh thép nó đã có rồi mà mất công đi tạo lại thì mất thời gian lắm ^_^


  4. @Bác Tue_NV:

    1. Chữ có dấu ở dạng hexa nên nhiều ký tự quá bác ạ! Em chưa biết cách giải quyết.???

    2. Description em làm được rồi, nhưng tiếng Việt vẫn bị nhảy tung tăng.

    PS: Muốn hiện tiếng Việt thì trong Description lại phải để Hexa.

     

    Trong Description Không cần phải để Hexa

    Ban quocmanh và vandv thử lisp này nhé

    (Trên file tạo description của vandv)

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from http://www.cadviet.com/forum/topic/69520-nho-gia-p-do-lisp-dem-block-blkqty/
    (defun c:BlkQty (/ blk_id blk_len blk_name blks cur_var ent h header_lsp height i
             ins j len0 lst_blk  msp pt row ss str tblobj width width1 width2 x y);;
    ;;  By : Gia Bach, gia_bach @  www.CadViet.com             ;;
    (defun TxtWidth (val h msp / txt minp maxp)
      (setq    txt (vla-AddText msp val (vlax-3d-point '(0 0 0)) h))
      (vla-getBoundingBox txt 'minp 'maxp )
      ;(vla-Erase txt)
      (-(car(vlax-safearray->list maxp))(car(vlax-safearray->list minp)))  )
    
    (defun GetOrCreateTableStyle (tbl_name / name namelst objtblsty objtblstydic tablst txtsty)
      (setq objTblStyDic (vla-item (vla-get-dictionaries *adoc) "ACAD_TABLESTYLE") )  
      (foreach itm (vlax-for itm objTblStyDic
             (setq tabLst (append tabLst (list itm))))
        (if (not
          (vl-catch-all-error-p
            (setq name (vl-catch-all-apply 'vla-get-Name (list itm)))))
          (setq nameLst (append nameLst (list name)))  )  )
      (if (not (vl-position tbl_name nameLst))
        (vla-addobject objTblStyDic tbl_name "AcDbTableStyle"))
      (setq objTblSty (vla-item objTblStyDic tbl_name)
        TxtSty (variant-value (vla-getvariable *adoc "TextStyle")))
      (mapcar '(lambda (x)(vla-settextstyle objTblSty x TxtSty))
              (list acTitleRow acHeaderRow acDataRow) )
      (vla-setvariable *adoc "CTableStyle" tbl_name) )
    
    (defun GetObjectID (obj)
      (if (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
        (vlax-invoke-method
          (vla-get-Utility *adoc)
          'GetObjectIdString obj :vlax-false )
        (vla-get-Objectid obj)))  
    ;main
      (if (setq ss (ssget (list (cons 0 "INSERT"))))
        (progn
          (vl-load-com)
          (setq i -1 len0 8)
          (while (setq ent (ssname ss (setq i (1+ i))))
        (setq blk_name (cdr(assoc 4 (entget(tblobjname "block" (vla-get-effectivename (vlax-ename->vla-object ent)))))))  
        (if (> (setq blk_len (strlen blk_name)) len0)
          (setq str blk_name len0 blk_len) )    
        (if (not (assoc blk_name lst_blk))
          (setq lst_blk (cons (cons blk_name 1) lst_blk))
          (setq lst_blk (subst (cons blk_name (1+ (cdr (assoc blk_name lst_blk))))
                       (assoc blk_name lst_blk) lst_blk)))        )
          (setq lst_blk (vl-sort lst_blk '(lambda (x y) (< (car x) (car y)) ) ))
          (setq cur_var (mapcar 'getvar '("DYNMODE" "DYNPROMPT")))
          (mapcar 'setvar '("DYNMODE" "DYNPROMPT") '(1 1))
          (initget "Yes No")
          (setq ins (getkword "\nChen ki hieu Block [Yes/No ] <yes> : ") )
          (or ins (setq ins "Yes"))
          (mapcar 'setvar '("DYNMODE" "DYNPROMPT") cur_var)      
          (or *h* (setq *h* (* (getvar "dimtxt")(getvar "dimscale"))))
          (initget 6)
          (setq h (getreal (strcat "\nChieu cao chu <" (rtos *h*) "> :")))      
          (if h (setq *h* h) (setq h *h*) )
          (setq *adoc (vla-get-ActiveDocument (vlax-get-acad-object))
            msp (vla-get-modelspace *adoc)
            blks (vla-get-blocks *adoc))      
          (setq width1 (* 2 (TxtWidth "STT" h msp))
            width (* 2 (TxtWidth "So luong" h msp))
            height (* 2 h))
          (if str
        (setq width2 (* 1.05 (TxtWidth (strcase str) h msp)))
        (setq width2 width))
          (if (> h 3)
        (setq width (* (fix (/ width 10))10)
              width1 (* (fix (/ width1 10))10)
              width2 (* (fix (/ width2 10))10)
              height (* (fix (/ height 5))5)))
          (GetOrCreateTableStyle "CadViet")
          (setq pt (getpoint "\nDiem dat Bang :")
            TblObj (vla-addtable msp (vlax-3d-point pt) (+ (length lst_blk) 2) 5 height width))
          (vla-put-regeneratetablesuppressed TblObj :vlax-true)
          (vla-SetColumnWidth TblObj 0 width1)
          (vla-SetColumnWidth TblObj 1 width2)
          (vla-put-vertcellmargin TblObj (* 0.75 h))
          (vla-put-horzcellmargin TblObj (* 0.75 h))
          (mapcar '(lambda (x)(vla-setTextHeight TblObj x h))
              (list acTitleRow acHeaderRow acDataRow) )
          (mapcar '(lambda (x)(vla-setAlignment TblObj x 2))
              (list acTitleRow acHeaderRow acDataRow))      
          (vl-catch-all-error-p (vl-catch-all-apply (function(lambda () (vla-MergeCells TblObj 0 0 0 3)) )))
          (vla-setText TblObj 0 0 "Bang thong ke")
          (setq j -1 header_lsp (list "STT" "Ten" "Don vi" "So luong" "Ky hieu"))
          (repeat (length header_lsp)
        (vla-setText TblObj 1 (setq j (1+ j)) (nth j header_lsp)))
          (setq row 2 i 1)    
          (foreach pt lst_blk
        (setq blk_name (car pt) j -1 )
        (mapcar '(lambda (x)(vla-setText TblObj row (setq j (1+ j)) x))
            (list i blk_name "cai" (cdr pt)))
        (if (= ins "Yes")
          (vlax-for blk blks
            (if; (= (vla-get-Name blk) blk_name)
            (= (cdr(assoc 4 (entget(tblobjname "block" (vla-get-name blk))))) blk_name)
              (vla-SetBlockTableRecordId TblObj row 4 (GetObjectID blk) :vlax-true))) )
        (vla-SetCellAlignment TblObj row 1 7)
        (vla-SetCellAlignment TblObj row 3 9)
        (setq row (1+ row) i (1+ i))    )
          (vla-put-regeneratetablesuppressed TblObj :vlax-false)
          (vlax-release-object TblObj) )  )
      (princ))
    • Vote tăng 1

  5. Ở phần chữ không có dấu là để lấy bề rộng cột chứa tên thiết bị.

    Theo tui biết nếu làm trực tiếp trong lisp thì chỉ có cách ấy.

     

    -Cái này phải mất công bạn vandv phải dùng thêm chương trình để chuyển nữa rồi ^_^

    - Tìm bề rộng cột đâu cần phải ghi chữ không dấu

    Chữ có dấu tìm bề rộng nó cũng tương đương với chũ không dấu.

    Bạn kiểm tra lại nhé!

     

     

    -Theo mình cách hay nhất vẫn nên sử dụng description của block để mô tả. Sau đó dùng Lisp để đọc

    Việc này cũng khá nhanh. Vì trong lệnh BEDIT cũng vốn đã hiển thị tên Block với mô tả description. Bạn ấy lại đặt Block theo tên bắt đầu bằng chữ D_ nên việc sử dụng description của block để mô tả rất dễ dàng


  6. Trong cad cũng có lệnh DATAEXTRACTION kết xuất nhiều loại dữ liệu. Vì nhiều loại nên để thống kê block đến 8 step, Cộng thêm 8 step để đổi tên ký hiệu block thành tên đầy đủ từ excel. Và kết quả là xuất bảng thống kê nhưng không có số thứ tự và hình ký hiệu block như lisp của bác gia_bach. Mình muốn nhờ các pro tìm phương án thống kê nhanh chóng theo cách.

    1. Dùng lisp BlkQty của bác Gia_bach để tạo bảng.

    2. Đổi tên ký hiệu block thành tên đầy đủ block từ bảng dữ liệu nguồn block từ excel.

     

    Chào bạn!

    Như vậy bạn phải cần thêm "phụ tùng" là file excel diễn giải cho việc mô tả tên Block

    Sao bạn không dùng chức năng của CAD là gán "miêu tả" đó cho Description của Block

    để khi quét dữ liệu trên CAD là ra bảng đó luôn , không cần file Excel vì đã miêu tả thông qua description của Block

     

    Bạn upload File CAD và File Excel của bạn lên đây nhé!


  7. Chào các anh chị,

    Em có 1 bài toán  như sau,mong anh chị giúp em code vài dòng hoặc giúp em thuật toán ạ,

    Em có 1 danh sach các điểm  là

    • lstpoint (p1 p2...pn ) với n>=3 ,đây là danh sách các toạ độ điểm đã được sắp xếp theo hướng tăng dần của toạ độ x
    • Điều em cần là làm sao so sánh được các khoảng cách của các toạ độ lien tiếp nhau có bằng nhau hay không để đo kích thước ạ.

    Nếu khác nhau thì gán toạ độ đó vào list : lst1 (loai ra khỏi tập lstpoint)

    Nếu  bằng nhau thì gán tọa độ đó vào list : lst2 (loai ra khỏi tập lstpoint)

    • Mục đích của em  là để đo kích thước các lỗ bolt liên tiếp nhau,nếu nó bằng nhau thì edit đường đo kích thước các bolt liên tiếp là ( (n-1)@ khoangcachbolt) giống như biểu diễn bước thép trong xây dựng vậy ạ ,nếu nó không bằng thì đo kích thước từng cặp sai khác đó ạ

    Em giải thích vậy mong mọi người giúp,vì công ty em không cho upload file nên đành phải diễn dãi thành lời suông vậy ạ

    Chào bạn!

    Chỗ dòng màu xanh là mình không hiểu 

    "Nếu khác nhau thì gán toạ độ đó vào list : lst1 (loai ra khỏi tập lstpoint)"

    Toạ độ đó là toạ độ nào bạn? Khi bạn so sánh kích thước liên tiệp nhau tương ứng với 3 điểm p1, p2, p3

    Vậy khác nhau thì gán cả 3 toạ độ p1, p2, p3 vào lst1 sao bạn?


  8. Nhờ mọi người viết giúp lisp dùng để gộp Dimension và Text Style trong bản vẽ về Dimension và Text Style chuẩn cụ thể như sau:

    - Đánh lệnh GD (gộp dimension) -> select chọn 1 Dim thuộc Dimension chuẩn (ví dụ: DIM1-100 có trên bản vẽ) -> select chọn các Dim thuộc Dimension khác (ví dụ: DIM1-10, DIM1-200....D1-20.v.v...) muốn chuyển về Dimension chuẩn. Thì tất cả các Dim thuộc các Dimension được chọn đó sẽ chuyển về Dimension: DIM1-100.

    - Đánh lệnh GT (gộp text style) -> select chọn 1 text thuộc Text Style chuẩn (ví dụ: TEXT GHI CHU có trên bản vẽ) -> select chọn các text thuộc các Text Style khác (ví dụ: TEXT TIEU DE; T THEP.....) muốn chuyển về Text Style chuẩn. Thì tất cả các Text (Dtext hoặc Mtext) thuộc các Text Style được chọn sẽ chuyển về Text Style: TEXT GHI CHU.

    Đây là bản vẽ mình lấy làm ví dụ: http://www.cadviet.com/upfiles/4/136880_ban_ve_vd.dwg

    Mong mọi người giúp đỡ, cảm ơn!

     

    Bạn có thể dùng lệnh MA kết hợp 'FI


  9. Hehe, mấy bữa mình cũng nhiều cách và cũng đã làm như vậy nhưng không được tại vì mình không sai đâu.

    ví dụ: bạn lấy 2 cây 11700 nối lại với nhau thì phải trừ đi 30d rồi, nên chỉ còn là 23400-30D, vậy khi muốn chiều dài là 23400 thì phải nối thêm một đoạn là (23400-30D)+30D. Cho nên nó bằng 2 mối nối, tương tự nếu muốn có chiều dài là 35100 thì phải có 3 mối nối.

    Cái này chỉ còn khi thác ở chỗ bạn nói là không ai mà dùng thép số lẻ cả nhưng vậy thì nó lại khó ở chỗ là khi CHIỀU DÀI = 11700 và cấp số nhân của 11700

     

    Mình không hiểu ý bạn nói

    Nếu như cây 23400 thì chỉ cần 2 cây 11700 nối đối đầu với nhau và chỉ cần 1 đoạn nối thôi chứ nhỉ?


  10. Nếu CHIỀU DÀI = 11700 thì đâu có cộng thêm đoạn thép nối đâu bạn, chỉ khi chiều dài lớn hơn 11700 thì mới cộng thêm đoạn thép nối CHIỀU DÀI/11700)*30*Đường kính

    Cụ thể là thế này:

    CHIỀU DÀI <= 11700 thì kết quả của hàm (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 0

    11700<CHIỀU DÀI <23400 thì kết quả trả về là (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 1

    -> sai <=23400 mới đúng

    23400 <=CHIỀU DÀI < 35100 (hoặc cấp số nhân của 11700 trừ cấp số nhân là "1") thì kết quả (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 2

    -> sai 23400<chiều dài<=35100 mới đúng

    ......

    Hehe, mình không biết phải làm sao nữa, vấn đề là khi CHIỀU DÀI = 11700 thì (trunc (CHIỀU DÀI/11700)*30*Đường kính) = 0

    mà CHIỀU DÀI = 23400 thì (trunc (CHIỀU DÀI/11700)*30*Đường kính) = 2

     

    Lợi dụng tính chất là kích thước thép buộc phải là số nguyên, bạn có thể làm như sau:

    Chiều dài +(trunc((chiều dài-0.1)/11700)*30*D)

     

    Không thể nào nhập thanh thép mà thanh nó có kích thước 11700.1 cả, phải không?

    Mà thanh thép có L=11701 thì đương nhiên >11700 thì phải +30D rồi, pk? ^_^

     

    PS: Mấy dòng mình bôi xanh trong bài viết của bạn là mấy dòng bạn viết có sự nhầm lẫn đó ^_^


  11. Hehe, xin lỗi mình nhầm: nếu CHIỀU DÀI bé hơn hoặc bằng 11700 thì kết quả trả về là CHIỀU DÀI, nếu lớn hơn 11700 thì kết quả trả về là CHIỀU DÀI + 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700). Mình định đặt cái hàm này vô công thức tính chiều dài thép luôn, bạn có cách nào giải quyết không giúp mình với, chỉ còn mỗi chỗ này nữa thôi.

    ................

    Cảm ơn bạn và mọi người!

     

    Hàm Trunc Giải quyết chỗ này tốt mà bạn!

    Chiều dài + (trunc (CHIỀU DÀI/11700)*30*Đường kính)


  12. Mình còn bị vướng một vấn đề mà tìm không ra được cách giải quyết, là ở chỗ nếu mà CHIỀU DÀI =<11700 thì kết quả trả về cũng kết quả là bằng 0, nên dùng hàm trunc không được. Mong bạn và mọi người chỉ mình cách tính trong formula giống như hàm if trong excel là:

    IF(CHIỀU DÀI <= 17000,CHIỀU DÀI,CHIỀU DÀI + 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700)

    (nếu chiều dài bé hơn hoặc bằng 11700 thì kết quả trả về là 11700, nếu chiều dài lớn hơn 11700 thì kết quả trả về là bằng 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700)

    Cảm ơn bạn và mọi người trước nhé!

     

    Cái này lạ nghe!

    - Nếu chiều dài <11700 thì trả về 11700 . Ví dụ chiều dài thanh thép có 1,0m thì trả về 11,7m thì lạ quá!

    - Câu màu đỏ mâu thuẫn với câu màu xanh trong bài viết của bạn!

    - Trong Formular không có if 


  13. ThankS bạn Tue_NV nhiều nha! Nhưng bây giờ thì chỉ sửa dim được thôi, còn text thì không đổi màu được nữa. 

     

    Sorry! Bạn thay dùm mình đoạn code

    (if (and (wcmatch (cdr(assoc 0 (entget ent))) "*TEXT") (null (eq (type ent) 'ENAME)))

      (if (/= (cdr(assoc 1 (entget ent))) cont)

        (command ".chprop" ent "" "c" mausac "")

    )

    )

    Bằng đoạn :

    (if (wcmatch (cdr(assoc 0 (entget ent))) "*TEXT") 

         (if (/= (cdr(assoc 1 (entget ent))) cont)

          (command ".chprop" ent "" "c" mausac "")

    )

    )

    • Vote tăng 1

  14. Ok bạn! Vì có những dim mình không định sữa nhưng khi mình lỡ tay chạm vào thì nó vẫn đổi màu. 

    Vậy bạn dùng lisp này:

    (defun c:CTE (/ mausac mouse cont contt ent)
    (vl-load-com)
    (setq mausac "1") ; thay doi mau o day
    (setq mouse nil)
    (prompt "\n Chon doi tuong :")
    (while (/= (car mouse) 2)
    (setq mouse (grread 0 15 2))
    (if (= (car mouse) 3)
    (if (and (setq ent (nentselp (cadr mouse)))
             (or (wcmatch (cdr(assoc 0 (entget (car ent)))) "*TEXT")
              (eq (type (last ent)) 'ENAME)
    )
         )
       (progn
    (if (and (wcmatch (cdr(assoc 0 (entget (car ent)))) "*TEXT") (null (eq (type (car (last ent))) 'ENAME)))
       (progn (setq cont (cdr(assoc 1 (entget (setq ent (car ent)))))) (command ".ddedit" ent ""))
       (progn (setq cont (vlax-get (vlax-ename->vla-object (setq ent (car (last ent)))) 'TextOverride)) (command ".ddedit" ent ""))
    )
    (princ "\n doi tuong duoc pick chon/ENTER ke ket thuc chon")
     
    (if (wcmatch (cdr(assoc 0 (entget ent))) "*TEXT")
          (if (/= (cdr(assoc 1 (entget ent))) cont)
           (command ".chprop" ent "" "c" mausac "")
          )
    )
    (if (eq (type ent) 'ENAME)
     (if (= (cdr(assoc 0 (entget ent))) "DIMENSION")
       (if (/= (vlax-get (vlax-ename->vla-object ent) 'TextOverride) cont)
        ;(command ".ddedit" ent "" ".DIMOVERRIDE" "dimclrt" mausac "" ent "") )
    (command ".DIMOVERRIDE" "dimclrt" mausac "" ent "") )
       )
    )
    (princ "\nChon doi tuong")
    )
    )
    )
    )
    (princ)
    )
    
×