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

Danh Cong

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

    1.387
  • Đã tham gia

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

  • Ngày trúng

    117

Bài đăng được đăng bởi Danh Cong


  1. cái này phải kích từng đối tượng 1. Mình muốn chọn 1 cái nhiều đối tượng để sắp xếp thẳng hàng luôn ấy

     

    Ko biết bạn hiểu "Nhiều đối tượng" của bạn ở đây là gì !!! Nhưng với người viết lisp: "Nhiều đối tượng" ở đây có thể là Line, Text, Arc, Circle, Polyne.... vv...vv...

    Mỗi đối tượng đó có các điểm tâm khác nhau. Việc quét chọn chúng để sắp xếp thẳng hàng là ko thể. Sắp xếp ko được bản vẽ lại thành tùm lum ra.

     

    ----> Yêu cầu của bạn  "Nhiều đối tượng" là ko thể nhé !  :)  :)  :)

    • Vote tăng 1

  2. Mình làm như bạn hướng dẫn rồi nhưng vẫn chưa được bạn ơi. Nếu bạn pich vào 2 điểm được giá trị khoảng cách là 4 thì khi đó chọn text thay thế hiển thị là 4 chứ không phải 4.00 mặc dù trước đó mình chọn số thập phân là 02 số rồi. Nhở các anh sửa giúp. Em xin cảm ơn

     

    Code như sau:

     

    (defun c:KC (/ p1 p2 txt etxt d)

    (or (> (getvar 'USERI1) -1) (setvar 'USERI1 2))

      (initget 4)

      (setq stp (cond ((getint (strcat "\nSo chu so thap phan <" (itoa (getvar 'USERI1)) ">: ")))

                      ((getvar 'USERI1))))

      (setvar 'USERI1 stp)

     

    (setq p1 (getpoint "\n Chon diem thu nhat")

              p2 (getpoint "\n Chon diem thu hai ")

             txt (car (entsel "\n Chon text can thay" ))

              d (distance p1 p2)

             etxt (entget txt)

             etxt (subst (cons 1 (rtos d 2 stp)) (assoc 1 etxt) etxt)

    )

    (entmod etxt)

    (command "change" txt "" "p" "c" 1 "")

    (princ)

    )

     

     

     A @QuocManh  lỗi cũ kìa  :D  :D  :D

    Gõ  DIMZIN , set giá trị 0 rồi thử lại xem.


  3. À! Là chế độ truy bắt điểm, hình như nó chỉ phụ thuộc vào OSNAP setting và biến APERTURE chứ không phụ thuộc vào đối tượng.

    Mãi mà các anh mới chịu hiểu, em chỉ cần bắt điểm thôi   :)  :)

     

    Mình nghĩ soi nhầm là do Zoom chưa đủ lớn thôi, nên chăng bạn tạo một option để RE bản vẽ khi bạn không thể zoom tiếp được nữa, rồi lại tiếp tục chọn điểm

     

    Dạ, em vẫn phải làm y như anh nói. Cứ Zoom to rồi soi, soi ko dc lại Zoom., ko tránh khỏi thỉnh thoảng kích nhầm..  :D  :D  :D Do đó mí nhờ các anh đưa cao kiến xem cải thiện tình hình có khá khẩm hơn ko ạ.


  4. Em gửi ảnh minh họa. NIck em bị lỗi, ko up ảnh trực tiếp được. Anh xem qua link sau ạ.

    https://drive.google.com/file/d/0B8Wyt0hkwi0yZkVyTHVPdG1fbVE/view

     

    Tức là em sử dụng, thì vẫn bị bắt biểm ngoài A, nên ko đúng ý em muốn.

    Mục đích là cái chế độ bắt điêm bây giờ chỉ bật cho đối tượng A thôi.  :blink:  :blink:  :blink:

     

    Chưa thử, nhưng đọc qua lsp thì đúng yêu cầu rồi còn gì??? (điểm đầu, điểm cuối chính là bước 2)


  5. Em vừa load thử. Nhưng ko đúng ý anh ạ. 

    Ý em là

    B1.  Chọn đối tượng A.

    B2.   Chọn điểm 1  và điểm 2 nằm trên A

     

    Tức là em muốn trong B2. thì 2 điểm phải  nằm trên đối tượng A., không cho phép nó bắt điểm vào bất kỳ đối tượng nào khác ngoài A.    :(  :(

     

     

     

     

    Tôi tưởng bạn chỉ cần "gợi ý" : 

    (defun c:DC(/  Ent dis dis1 dis2 pt pt1 pt2)
      (if (and (setq Ent (car (entsel "\nChon doi tuong can do :")))
    	   (wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC,CIRCE")	   
    	   (setq pt1 (getpoint "\nDiem dau :" ))
    	   (setq pt2 (getpoint pt1 "\nDiem cuoi :" )))
        (progn
          (setq pt11 (vlax-curve-getClosestPointTo ent pt1)
    	    dis1 (vlax-curve-getDistAtPoint Ent pt11)
    	    pt12 (vlax-curve-getClosestPointTo ent pt2)
    	    dis2 (vlax-curve-getDistAtPoint Ent pt12))
          (setq dis (abs(- dis2 dis1)))
          (princ (strcat "\nKhoang cah :" (rtos dis)))  ) )
      (princ))
    

  6. Em cần các anh chị gợi ý cho đôi chút: 

    Ý định của em thế này:

     - Em đang có 1 đối tượng như Line,SPline LWpoline, Circle, Arc..., và 1 đoạn code lisp đo dài.

    Giả sử em chọn đối tượng Line  tên là A.  Bây giờ em muốn chọn 1 khoảng cách trên đối tượng A bằng cách pick 2 điểm ( chỉ bắt điểm trên đối tượng A, tuy nhiên vẫn giữ được các điểm giao cắt của các đối tượng khác với A là Intersec ) , mà ko bị bắt điểm lung tung sang đối tượng khác.

     

    Cách thủ công em vẫn làm là bật chết độ Intersec rồi zoom bản vẽ lên, soi điểm giao của A với đối tượng khác. Tuy nhiên thỉnh thoảng vẫn bị soi nhầm...  :wacko:  :wacko:

     

    Mong anh chị gợi ý.  :)  :)  :)


  7. Cảm ơn bác nhé. Đúng là Em có sử dụng lisp SPA. Em đã remove và thành công rồi ạ./.

     

    Áy náy quá :(  :( .....Vì mỗi cái Viewport mà bảo bạn gỡ lisp của bác @Hoành  thì áy náy quá, kẻo bác ý lại ghét tôi thì chết.  :blink: :blink:  Phải tôn trọng những người viết lisp bạn ạ.

    Thôi thế này: Bạn tìm trong lisp SPA của bác ý, xóa mỗi dòng ("MAXACTVP" 4),  thì bạn vẫn xài lisp tốt.  B) B)


  8. Cách 2: AB và AC. hoặc bạn ko ưng thì đổi tự tên cho phù hợp.

     

    Cách 1: Lôi họ hàng nhà group ra:  Tools--- Toolbars---- Autocad ---- Group. Đủ tiện ích của họ hàng nhà group cho bạn chọn.

    Cách 2:

    (defun c:AB ()
      (setvar "pickstyle" 0)(princ))
    (defun c:AC ()
      (setvar "pickstyle" 1)(princ))

     


  9. Các cao thủ có thể sửa giúp em làm sao để ghi ra kết quả nó theo đơn vị met được không ạ. chứ em thực hiện lệnh xong thì phần chữ số vẫn theo đơn vị mm :((. EM cảm ơn các bro trước.

     

    Được voi đòi 2 bà Trưng đây. Lạm dụng lisp nhiều quá ko tốt đâu nhé.

     

    Sửa thì dễ, nhưng bạn có thể thủ công thêm 1 dấu chấm sau 3 chữ số mà  ! Cứ thích yêu cầu 1 nháy chuột ăn ngay cơ  :D  :D  :D.


  10. Em cảm ơn bác nhé. Được rồi ạ. Nhưng có vấn đề là mỗi lần bật cad lên lại phải sử dụng lệnh đó.

    Bác có cách nào làm một lần mà được luôn không ạ?

     

    MAXACTVP là biến hệ thống trong cad. Đã nhập là giá trị sẽ không thay đổi sau khi nhập. Trừ khi bạn tác động bằng 1 hình thức nào đó.

    Đoán lỗi: Bạn sử dụng 1 lisp nào đấy , có đoạn code thay đổi giá trị MAXACTVP = 4 . Như lisp "SPA" của bác @Hoanh là ví dụ điển hình. 

    Nếu bạn ko rành lisp thì cách duy nhất là tìm lisp đó và gỡ nó ra thôi.  :(  :(  :(  Ko tìm được thì xui cho bạn rồi , mỗi lần mở là Cành cạch gõ lại thôi  :D  :D  !!!!


  11. Em cũng bị lỗi này. Cứ tạo thêm một khung nhìn mới thì các khung nhìn cũ lại bị ẩn phải dùng mv/on mới hiển thị lại.

    Nếu Em có 5 hay 10 mv thì cũng chỉ có thể nhìn thấy được 4 mv thôi ạ. Em xem máy của các bạn Em thì 20 khung MV vẫn không vấn đề gì.

    Các Anh ai giúp Em vấn đề này với ạ. Em cảm ơn ạ.

    Đoán lỗi do điều chỉnh số ViewPort hiển thị trên cad:

     

    Gõ MAXACTVP nhập giá trị 64 xem thế nào: 

    • Like 1
    • Vote giảm 1

  12. Đã chỉnh sửa cả 2 lisp.

     

     

    (defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
    ;;;--------------------------------------------------------------------
    (defun C:TL( / ss L e)
    (setq
    ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
    L 0.0
    )
    (vl-load-com)
    (while (setq e (ssname ss 0))
    (setq L (+ L (length1 e)))
    (ssdel e ss)
    )
    ;;;;; Chon text thay ket qua
      (setq sstext (car (entsel "Chon Text Thay Ket Qua ")))
      (setq sstext (subst (cons 1 (strcat "L=" (rtos L 2 2) " M" )) (assoc 1 (entget sstext)) (entget sstext)))
      (ENTMOD sstext)
      (princ)
      )
     
     
    (defun c:gb(/ p ss S frome cur toe tt)
    (setq p (getpoint "\n Pick 1 diem vao mien trong hinh kin :") 
    ss (ssadd) S 0)
    (while p
    (setq frome (entlast))
    (command ".boundary" p "")
    (setq toe (entlast));; 
    (setq cur frome
    )
        (while (not (eq cur toe))
    (setq cur (entnext cur)
    ss (ssadd cur ss))
    (command "area" "S" "O" ss "" "")
    (setq tt (getvar "area"))
    (setq S (+ S tt))
         )
      (command "area" "A" "O" "L" "" "")
      (setq tt (getvar "area"))
      (setq S (+ S (* tt 2))) 
    (sssetfirst ss ss)
    (setq p (getpoint "\n Pick 1 diem vao mien trong hinh kin :"))
     
    )
    (if (> (sslength ss) 0)
    (progn 
    (princ (strcat "Area = " (rtos S 2 2)))
    ;;;;; Chon text thay ket qua
      (setq sstext (car (entsel "Chon Text Thay Ket Qua ")))
      (setq sstext (subst (cons 1 (strcat "A=" (rtos S 2 2) " M2" )) (assoc 1 (entget sstext)) (entget sstext)))
      (ENTMOD sstext)
     
    )
    (alert "\n Ban chua Pick vao mien kin nao ca ")
    )
    (command "erase" ss "")
    (Princ)
    )

     

    • Vote tăng 1

  13. Sửa lần 2:

     

    Cả cái lisp GB bác làm giúp em nữa. Bác thêm cho em chèn vào text/Mtext theo font có trước với nhé.

    Bác giữ cả cái tiền tố và hậu tố giúp em

    Thx bác

     

     
    (defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
    ;;;--------------------------------------------------------------------
    (defun C:TL( / ss L e)
    (setq
    ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
    L 0.0
    )
    (vl-load-com)
    (while (setq e (ssname ss 0))
    (setq L (+ L (length1 e)))
    (ssdel e ss)
    )
    ;;;;; Chon text thay ket qua
      (setq sstext (car (entsel "Chon Text Thay Ket Qua ")))
      (setq sstext (subst (cons 1 (strcat "L=" (rtos L 2 2) " M" )) (assoc 1 (entget sstext)) (entget sstext)))
      (ENTMOD sstext)
      (princ)
      )
     
     
     
     
     
     
    (defun c:gb(/ p ss S frome cur toe tt)
    (setq p (getpoint "\n Pick 1 diem vao mien trong hinh kin :") 
    ss (ssadd) S 0)
    (while p
    (setq frome (entlast))
    (command ".boundary" p "")
    (setq toe (entlast));; 
    (setq cur frome
    )
        (while (not (eq cur toe))
    (setq cur (entnext cur)
    ss (ssadd cur ss))
    (command "area" "S" "O" ss "" "")
    (setq tt (getvar "area"))
    (setq S (+ S tt))
         )
      (command "area" "A" "O" "L" "" "")
      (setq tt (getvar "area"))
      (setq S (+ S (* tt 2))) 
    (sssetfirst ss ss)
    (setq p (getpoint "\n Pick 1 diem vao mien trong hinh kin :"))
     
    )
    (if (> (sslength ss) 0)
    (progn 
    (princ (strcat "Area = " (rtos S 2 2)))
    ;;;;; Chon text thay ket qua
      (setq sstext (car (entsel "Chon Text Thay Ket Qua ")))
      (setq sstext (subst (cons 1 (strcat "A=" (rtos S 2 2) " M2" )) (assoc 1 (entget sstext)) (entget sstext)))
      (ENTMOD sstext)
     
    )
    (alert "\n Ban chua Pick vao mien kin nao ca ")
    )
    (command "erase" ss "")
    (Princ)
    )

  14. dĩ nhiên là mình đã chạy lisp của bạn rồi.

    trong file demo của mình có 42 vùng khép kín. mỗi vùng có từ 1-5 con số khác nhau

    nếu dùng lisp của bạn thì mình chỉ làm việc với mỗi vùng mà thôi, như vậy cũng hơi bất tiện nếu số lượng vùng lớn.

     

    Uhm, cái này thì mình chưa viết được. Trình độ viết lisp chưa sâu nên chỉ giúp bạn được vậy thôi.

    Đành chờ các cao nhân khác giúp bạn vậy.


  15. bạn xem file demo giúp mình với. ý mình là trong 1 vùng khép kín có những con số. mình xin lisp cộng các số đó lại với nhau ấy. 

    Bạn đã thử sử dụng lisp mình gửi chưa ! Bạn hiểu thế nào về khái niệm lisp.

    Với bạn, thì những con số đó là 1. 2. 3 đơn thuần .... Còn với người lập lisp, đó là những Text với dữ liệu bên trong là số.

    Lisp cộng text ở đây: là cộng những con số bên trong Text

×