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

ngokiet

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

    404
  • Đã tham gia

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

  • Ngày trúng

    43

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


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

    em gửi bác ạ.

    convert sai.txt

    bác dùng cái lệnh txt2lsp trên đó.

    chọn lần lượt 3 cái text trong cad

    Rồi đưa lên dạng

    text 1 (183 32 208 32 204 32 ....)

    text 2(183 32 208 32 204 32 ....)

    text 3 (183 32 208 32 204 32 ....)

    - chứ mình thấy do font bạn là shx nên ko chăc. chứ font .vnarial nó có hiện đúng ko vậy


  2.  

    52 phút trước, loststars đã nói:

    cái vấn đề này đau đầu quá nhỉ. nhưng k biết cái này là lỗi ở đâu mà có sự khác biệt giữa những máy ạ? e tưởng bảng mã chữ này phải chung một bảng hết chứ ạ

    Lỗi là ở chỗ thay vì "Đ" nó thành "/U+00D0" nên nó không chuyển. Chỉ có mã đầu 183 nó chuyển thành chừ "Ó" thôi 

    Cái này chắc do setcode của HDH nên Cad mới chuyển qua thể hiễn kiểu /U+ nên chương trình bị lỗi.

    Muốn xử lý lỗi này thì khi code lisp convert xét thêm các ký tự kiểu này.

     


  3. 47 phút trước, huunhantvxdts đã nói:

    Lisp ở trên nó cho phép đo đường cong rồi nên không cần kiểm tra chỉ cần bắt được đối tượng polyline đưa vào thôi.

    đây là lisp mình viết có thêm 1 bước là chọn đối tượng sau khi filett

    
    (defun C:VBK(/ )
    (command "undo" "be")
    (setq cur_lay (getvar "clayer" ))
    (setq oldos (getvar "OSMODE"))
    (setvar "osmode" 0)
    (setvar "cmdecho" 0)
    (while ;(setq dtuong1 (car (entsel "\nChon doi tuong 1")))
    (or (and bkinh (or (= (type bkinh) 'int) (= (type bkinh) 'real))) (setq bkinh 5.00))
    (setq bkinh (cond ((getreal (strcat "\nNhap ban kinh cong (m) <" (rtos bkinh 2 2) ">: "))) (bkinh)))
    (command "FILLET" "R" bkinh)
    (command "FILLET" pause pause)
    (dobk)
    )
    (setvar "clayer" cur_lay)
    (setvar "osmode" oldos)
    (setvar "CMDECHO" 1)
    (command "undo" "end")
    (princ)
    )
    ;;;;;;;;;;;;;;;;;;;;;;;
    (defun dobk (/ acadobj doc i modelspace obj LM:BulgeCenter)
    (defun LM:BulgeCenter (p1 p2 B)
    (polar p1 (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan B)))) (/ (* (distance p1 p2) (1+ (* b B))) 4 B)))
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-activedocument acadObj))
    (setq modelSpace (vla-get-modelspace doc))
    (setq i 0)
    (setq e (car (entsel "\nChon cung dien ban kinh")))
    (setq obj (vlax-ename->vla-object e))
    (repeat (fix (vlax-curve-getendparam e))
    (if (/= 0 (vla-getbulge obj i))
    (vla-adddimradial modelSpace
    (vlax-3d-point (LM:BulgeCenter (vlax-curve-getpointatparam e i)
    (vlax-curve-getpointatparam e (1+ i))
    (vla-getbulge obj i)))
    (vlax-3d-point (vlax-curve-getpointatparam e (+ i 0.5)))
    -0.5)
    )
    (setq i (1+ i))
    )
    (princ)
    )

     

    Sao bạn làm rắc rối vậy.

    Bác chỉ cần thêm dòng này thay cho gọi hàm dobk là được rồi.

    (command "dimradius" "mid" pause "")

    Với lại vòng lặp while của bạn không có kết thúc trừ nhấn Esc nên các biến bạn lưu lại nó không trả về.

    Còn mình chỉ cần viết vậy là đủ

    (defun c:vbk(/ bkinh)
      (If (setq bkinh (getreal (strcat "\nNhap ban kinh cong (m) <" (rtos (getvar 'filletrad) 2 2) ">: "))
         (setvar 'filletrad bkinh))
      (command "fillet" pause pause)
      (command "dimradius" pause ""))

    Còn hàm dobk của bạn hình như là ghi kích thước tất cả các arc có trong polyline nên dễ bị trùng dim nếu polyline có arc trước khi fillet.

    Còn nếu bạn muốn bỏ chọn như bạn nói thì có mấy trường hợp

    - 2 line or 2 arc thì  nó là (entlast)

    - nếu đối tượng 1 là polyline thì nó là đối tượng 1 còn ko thì đối tượng 2.

    Vì vậy nếu bạn chắc chắn dt1 là polyline thì bạn muốn lấy đối tượng đó thì bạn đổi dòng

    (command "FILLET" pause pause)

    Thành 

    (if (setq dt1 (entsel "Nhap doi tuong 1")) (command "fillet" dt1 pause))

     

    • Like 1

  4. 16 phút trước, Danh Cong đã nói:

    + Bạn có thể tham khảo code của nợ này : ))))

    https://www.cadtutor.net/forum/topic/30482-dim-radius/

    Riêng code tự động đo góc thì không được hoàn thiện ( do chưa hiểu thông số tọa độ của nó ).

    + Code sai vòng lặp while.

     

    
    
    
    
    	(defun C:VBK( / DTUONG1 DTUONG2 )
    	(command "undo" "be")
    	    (or (and bkinh (or (= (type bkinh) 'int) (= (type bkinh) 'real))) (setq bkinh 5.00))
    	    (setq bkinh (cond ((getreal (strcat "\nNhap ban kinh cong (m) <" (rtos bkinh 2 2) ">: "))) (bkinh)))
    	      (while
    	      (and
    	      (setq dtuong1 (car (entsel "\nChon doi tuong 1")))
    	      (setq dtuong2 (car (entsel "\nChon doi tuong 2")))
    	      ); end and
    	    (command "FILLET" dtuong1 dtuong2)
    	    (command "DIMRADIUS" (list (entlast) (cdr (assoc 10 (entget (entlast)))) ) "_non" "")
    	    )
    	(command "undo" "end")
    	(princ)
    	)
    

    Hình như bác không xem kỹ. nếu 2 line hay 2 arc thì mới có entlast đễ ghi kích thước thì dễ rồi. 2 polyline thì khó.


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

    Ý là muốn đo bán kính của cung tròn đó chứ ko phải text. 

    Sau khi filett xong không phải chọn lại đối tượng mà nó đo luôn.

    Chứ bạn tạo text rồi pick điểm đến thì dùng lệnh đo bán kính rồi pick chọn cung nó đẹp hơn

    Ở đây ý mình là filett xong không chọn chi hết nó đo luôn bán kính

    Cám ơn bạn nhiều

    Nếu bạn muốn như vậy thì khi dim radius Thì dù sao cũng phải có thông tin về vị trí ghi kích thước.

    Bạn biết lisp nên mình cũng chỉ nói ý tưởng vì viết cũng khá rắc rối.

    - Lệnh Fillet 2 polyline thì nó sẽ tạo ra 1 polyline có ename là ename của polyline đầu. 

    - Vì vậy bạn nên lấy dữ liệu polyline đầu. Sau lệnh fillet thì kiểm tra thay đổi để xác định đoạn cung tròn để ghi kích thước.

    VD:

    (setq en1 (entsel)

              old (entget(car(entsel))))

    (command "fillet" en1 pause)

    (setq new(entget(car(entsel))))

    (.... So sánh old vs new xác định arc để ghi dim cung tròn...)

    (có thể Dùng các Hàm như vlax-curve-getClosestPointTo, vlax-curve-getParamAtPoint để xác định đoạn nào cùa polyline trước sau fillet để định vị cung tròn)

     

     

     


  6.  

    2 giờ trước, Black_Cat_ đã nói:

    Em làm bản đồ địa chính có một block, trong block bao gồm các đối tượng là: số tờ, số thửa, DTKV, chủ nhà tên đường.... Giờ em muốn lấy thông tin của từng loại ví dụ như số thử ra thành layer thửa , số tờ thành layer số tờ, DTKV là thành DTKV , chủ nhà thành layer chủ nhà.....vv..vv . có cách nào phá block ra mà các thông tin nó ra từng layer được không ạ, em đã thử dùng lệnh x nhưng thông tin nó bị mất đi....Em xin cảm ơn, đây là file cad ạ

    du lieu 1.dwg

    Thừ lisp này nó export att ra các layer theo tab

     

     

    xba.lsp

    • Like 1

  7. Bác viết hàm giống lệnh fillet luôn rồi thì cần gì biến bkinh nữa. Nó có biến filletrad rồi mà

    Nếu bác muốn đọc bkinh thì (getvar 'filletrad) là được.

    Còn bác muốn điền bán kính bằng text hay dim thì bạn thêm lệnh command đó vào vì dù sao cũng cần có vị trí đặt text.

     

    Ví dụ như chèn text. Mình tao text ở vị trí '(0 0 0) rồi move lên

    (defun c:vbk(/ ent)
      (command "fillet" "r" pause)
      (While (/= (getvar 'cmdactive) 0) (command pause))
      (command "fillet" pause pause)
      (command "text" '(0 0 0) "" "" (rtos (getvar 'filletrad) 2 2) "")
      (command "move" (entlast) "" '(0 0 0) pause))

     


  8. mình đã thêm rùi mà.. nó sửa dược file mình vừa mở thôi bạn

    - Mình mới test thử thì các file vùa mở nó đều chuyển thành unitless.

    Thêm vào startup suite thì nó sẽ load lisp sau khi mở file. Mà lisp nó chuyển sang unitless và qsave

    Không biết tại sao mình chèn code nó mất linh tinh nên mình chèn lại file lsp

     

    42 phút trước, Gia phuc đã nói:

     

     

    xx.LSP

    • Like 1

  9. Thừ lisp sau

     

    - Nó export tất cả layout vào thư mục mặc định của bản vẽ hiện hành.

    Mình chỉ viết sơ như vậy.

     

    Nêu muốn chọn nhiều file thì rắc rối 1 chút.

    - Bạn có thể sửa lisp lại 1 chút là thêm 1 dòng (c:test) vào cuối lisp và cho nó vào starup suite. Bạn mở file nào thì nó tự động xuất file đó.

    - Xong nhớ xóa vì không cần nó cũng tự động.

    Làm vậy cho đơn giản.

      

       

     

     

    exlayout.LSP

    • Like 1

  10. 1 giờ} trướ}c, ThinhBK đã nói:

    Tức là như này bác ạ:

    - 120 bản vẽ của e đều link đến 1 file xref duy nhất, e đã để chế độ relative path rồi mà khi coppy sang máy khác vẫn không hiển thị, kiểm tra lại hóa ra nó ở chế độ relative path nhưng đường dẫn vẫn là full path (e không hiểu tại sao thế luôn, e thử xref 1 số file khác ở chế độ relative path thì file được file không), thế nên e mới định đổi đường dẫn cho nó từ full path sang relative path: C:\abc thành \\..\\folder, nhưng nếu sửa 120 file thì lâu quá ạ.

    - Bác có thể hướng dẫn e dùng reference manager và dùng lisp cho việc này được không ạ!

    Thank bác nhiều

    - Reference manager là lệnh externalreferences (Ở menu chọn Insert-External References) Dùng quản lý file xref trong cùng 1 file.

    - Dùng lisp thì phải biết chút ít về lập trình. Do có 120 files nên bạn chỉ có thể mở từng file hay lập trình cho nó tự động mở.

    Còn đoạn mã để nó sửa path lại là:


     

    (vlax-for bb (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'blocks)
      (if (eq (vla-get-name bb) "XXX")
        (vla-put-path bb "..\\folder\\xxx.dwg")))
    (command "qsave") 

     

    XXX: Tên block của file xref

    "..\\folder\\xxx.dwg" : Là đường dẫn  relative path mà bạn muốn sửa lại.

    Dòng cuối  là để tự động save lại

    Bạn có thể copy đoạn mã trên thành file lsp rồi cho nó load nó thì nó tự sửa và save lại.

    Bạn có thể cho load tự động. Mở hết 120 file trên rồi thoát thì nó sửa hết cho bạn. Cái này thì mình chưa thử nhưng mình nghĩ chắc là ok thôi.


  11. Sai thì sửa lại.

    - Nếu bạn có 1 file mà xref 120 file khác có đuòng dẫn khác nhau thì bạn dùng reference manager sửa lại. Còn có quy luật gì thì bạn nên nói rõ. ví dụ nhủ đổi path từ c:\abc thành d:\def gì đó anh em mới giúp dc.

    = Còn 120 file mà file nào cũng có xref riêng thì chỉ có lisp mới tự động sửa 1 lần.

    Nếu ko thì bạn chép file xref vào cùng thư mục nó sẽ tụ tìm dc cho bạn.


  12. Viết Lisp thì cũng dễ

    .1. Làm theo cách bác @conghoa thì dùng lệnh bắt điểm from. (Có bắt vuông góc là dc.

     Lisp

    (defun c:d1() (command "_dimaligned" pause "_from" pause))

    2. Có 1 cách nữa là bắt 2 điểm và xét object bằng lệnh nentselp

    Lisp:

    (defun c:dab(/ p1 p2)
      (setq p1 (getpoint "Get start point:")
        p2 (getpoint "Get end point:"))
      (command "_dimaligned" p1 "non"
           (vlax-curve-getclosestpointto (vlax-ename->vla-object (car (nentselp p1))) p2) pause))

    Lisp sau mình để chuẩn wcs. Nếu ucs ko phải Wcs thì dùng thêm lệnh trans.


  13. 5 giờ trước, anhGeodesy đã nói:

     

     

    OMG !  Nó đây phải ko bác @Danh Cong Nhưng giới hạn kiểu L1+L2 <=11700 thì làm sao bác nhỉ?

    Không biết bạn thường vẽ như thế nào nhưng nếu bạn muốn check tổng thì thay đổi L thành L tổng. Thay đổi L1 sẽ ko thay đổi L tổng, 

    Ví dụ

    Mình sửa lại 1 chút cho dễ sử dụng

    dyn.dwg

    • Vote tăng 1
×