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

nguyentuyen6

Nhà quảng cáo
  • Số lượng nội dung

    212
  • Đã tham gia

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

  • Ngày trúng

    3

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


  1. Chủ thớt cho mình hỏi cái, mình có cái khung tên như đính kèm

    nếu chọn fit to paper thì không đúng tỉ lệ, còn nếu chọn đúng tỉ lệ 1:100 thì in ra bị mất viền khung

    bạn giải thích hộ mình với

    P/s: mình in PDF sử dụng pdf factory

    http://www.cadviet.com/upfiles/3/9928_a3_grc.dwg

    9928_712014_95516_pm.jpg9928_712014_95547_pm.jpg

    Cái này do khung của bạn chưa đúng nên mới bị, Bạn chỉnh sửa lại khuung cho đúng tiêu chuẩn khổ giấy là được


  2. sao khi mình in mình chọn intheo xref, nó ra những khung in rất to chứ không chỉ in mỗi cái xref khung tên của mình. thử nhiều lần rồi toàn bị vậy.

    Chắc khung của bạn có Mtext nên bị thế. Mình nghĩ chắc cái Mtext khi bạn kích vào edit thì cái khung chỉnh sửa nó bị tràn ra khỏi vùng khung tên của bạn, bạn chỉ kéo nó vào bên trong khung tên là được ( click chuôth trái vào khung > chọn edit block > click đúp vào Mtect > kéo cái mũi tên "<"  hay  ">" trong Mtext vào hẳn bên trong khung tên).

     

    Về phần chọn khung tên Dynamic thì cũng rất dễ, mình có viết nhưng chưa up lên do thấy lúc chọn khung tên nó không trực quan cho lắm ( hoặc do chưa biết ), mới lại mình thấy rất ít người dùng kiểu khung này, bây giờ mính cũng up lên #1, bạn nào dung khung tên dynamic thì dùng cái này được.

    p/s: dạo này đang m thất nghiệp nên chuyển sang làm freelancer trên elance nên không có thời gian để chỉnh sửa, các bạn thông cảm nhé


  3.  Sửa nhanh cho bạn

    Các anh xem giúp em đoạn Lisp này xíu ah!

    Mong muốn của em:

    - Chọn đối tượng 1 (có chứa text)

    - Chọn đối tượng 2 (có chứa text)

       Đoạn LISP có chức năng copy nội dung đối tượng 1 dán vào đối tượng 2 và xóa đối tượng 1.

       Vòng lặp đến khi "space" kết thúc lệnh.

    (defun C:CTE (/ etname  etlist  ettype  newtext
                     et2 etname2 etlist2 ettype2 oldtext net)
      (while
        (if (setq net (nentsel "\nSelect origin text! :"))
            (setq
                etname (car net)
                etlist (entget etname)
                ettype (cdr (assoc 0 etlist))
                newtext (cdr (assoc 1 etlist))
            )
        )
        (if (= (substr newtext 1 4) "\\A1;")(setq newtext (vl-string-subst "" "\\A1;" newtext)))
        (if (or (= ettype "TEXT") (= ettype "ATTRIB") (= ettype "MTEXT") (= ettype "DIMENSION"))
        (progn
            (setq et2 (entsel (strcat "\n" "String <" newtext "> will replace for each text you select!")))
            (setq
                etname2 (car et2)
                etlist2 (entget etname2)
                ettype2 (cdr (assoc 0 etlist2))
                oldtext (assoc 1 etlist2)
            )
                    (setq etlist2 (subst (cons 1 newtext) oldtext etlist2))
                    (entmod etlist2)
                    (entupd etname2)
                    (entdel etname)
        );progn
        )
      )
      (princ)
    )
    

  4. Bạn thanhduan viết rồi mà thôi kệ mình cứ post thử cái này. :D

     

    (defun c:b2p(/ lst lstData lstB lstP p index kc)
    	(and
    	    (setq kc (getdist "\nKhoang cach toi da:" ));;;setq
    	    (setq  ten_blk (cdr (assoc 8 (entget(car (entsel "\nChon block mau:"))))))
    		(princ "\nChon vung thuc hien");;;princ
    		(setq ss (ssget (list (cons 0 "INSERT,POINT"))))
    		(setq lstData (acet-ss-to-list ss))
    		(foreach e lstData (if (and (= (cdr (assoc 0 (entget e))) "INSERT")(= (cdr (assoc 8 (entget e))) ten_blk)) (setq lstB (cons e lstB)))
    						   (if (= (cdr (assoc 0 (entget e))) "POINT") (setq lstP (cons e lstP)))
    		)
    	)
    	;(princ lstP)
    	(setq index 0)
    	(while (< index (length lstB))
    		(setq xx  (nth index lstB));;;setq
    		(setq p (cdr (assoc 10 (entget xx))))
    		(setq lstP (vl-sort lstP '(lambda(x y)(<= (distance (cdr (assoc 10 (entget x))) p)(distance (cdr (assoc 10 (entget y))) p)))))
    		(if (< (distance (cdr (assoc 10 (entget (car lstP)))) p)  kc)
    			(entmod (subst (cons 10 (cdr (assoc 10 (entget (car lstP))))) (assoc 10 (entget xx)) (entget xx))) ;;; if T
    		)
    		(setq index (1+ index))
    	);;; end While 
    )
    ;;;ketxu
    
    • Vote tăng 2

  5.  

    Mình chuyển như bạn nói chương trình chạy ngay là: nó chọn tên lớp và trong lớp vừa chon đấy có đối tượng nào là nó tính công, trừ hết luôn nên không đúng ý

    Ý mình là làm nhiều lần và mỗi lần thì layer đích là:

    layer1 -> evnew_layer1

    và ... Bạn ạ

    Mình ko hiểu ý bạn lắm. Ở lisp của mình thì bước đầu tiên là chọn chọn đối tượng để lấy tên layer của nó. Nếu bạn muốn tính cho toàn bộ các TEXT thuộc layer nào thì trong bước chọn đầu tiên chọn đối tượng có tên layer muốn tính.


  6. Bạn thử cái này xem

     

    (vl-load-com)
    (Defun Init()
     (setvar "BLIPMODE" 0)
     (setvar "CMDECHO" 0)
    )
    (Defun Reinit()
     (setvar "BLIPMODE" 1)
     (setvar "CMDECHO" 1)
     (setvar "LUPREC" 4)
     (princ)
    )
    
    (defun sai()
     (setq pt (cdr (assoc 10 lEi)))
     (setq hi (cdr (assoc 40 lEi)))
     (makeC pt hi)
    )
    
    (Defun MakeC( pt h / edt)
       (setvar "LUPREC" 2)
       (setq edt (list (cons 0 "CIRCLE")
                       (cons 8 "tron")
                       (cons 62 2)
                       (cons 10 pt)
                       (cons 40 (* hi 10))
                 )
        )
        (entmake edt)
    )
    (Defun Makedocao( pt h stl hi wi layer / edt)
       (setvar "LUPREC" 2)
     
    
      (setq edt (list (cons 0 "text")
                       (cons 8 layer)
                       (cons 62 5)
                       (cons 10 pt)
                       (cons 1 (rtos h 2))
                       (cons 7 stl)
                       (cons 40 hi)
                       (cons 41 (* wi 0.8))
                       (cons 71 1)
                 )
        )
        (entmake edt)
    )
    
    (defun chelv( layer / stl pt hi wi)
     (setq stl (cdr (assoc 7 lEi)))
     (setq pt (cdr (assoc 10 lEi)))
     (setq hi (cdr (assoc 40 lEi)))
     (setq wi (cdr (assoc 41 lEi)))
     (makedocao pt (+ dc osdc) stl hi wi layer)
     (print i)
    )
    
    (defun c:cdc(/ osdc ss noet i ei dc list_layer ii EN LAYER_NAME LEI SS_LAYER TENLAYER)
     (Init)
     (setq list_layer (list))
     ;(setq la (getstring "\n Layer nao ? : "))
     (princ "\nChon doi tuong layer mau:");;;princ
     (setq ss_layer (ssget))
     (setq i 0 );;;setq 
     (while (< i (sslength ss_layer))
        (setq en (ssname ss_layer i))
    	(setq layer_name  (cdr (assoc 8 (entget en))));;;setq
    	;(princ layer_name)
        (setq list_layer (append list_layer (list layer_name)))
        (setq i (1+ i))
      )
    (setq list_layer (LM:Unique list_layer))
    (setq ii 0 );;;setq 
    (setq osdc (getdist "\n Cong them bao nhieu ? : "))
    (while (< ii (length list_layer))
     (setq ss (ssget "X" (list (cons 0 "TEXT") (cons 8 (nth ii list_layer)))))
     (setq NoET (sslength ss))
     (setq tenlayer (nth ii list_layer))
     ;(princ (strcat "\n" (itoa NoET) " Doi tuong se bi thay doi"))
     ;(getint)
     (setq i 0)
          (Repeat NoET
              (setq Ei (ssname ss i))
              (setq i (+ 1 i))
              (setq lEi (entget Ei))
              (if (null (read (cdr (assoc 1 lEi))))
                  (progn
                        (sai)
                  )
                  (progn
                        (setq dc (read (cdr (assoc 1 lEi))))
                        (if (numberp dc) (chelv  (strcat "evnew_" (itoa (1+ ii)))))
                  )
              );if
          );Repeat
    (setq ii (1+ ii))
    )
     (Reinit)
    )
    (defun LM:Unique ( l / x r )
        (while l
            (setq x (car l)
                  l (vl-remove x (cdr l))
                  r (cons x r)
            )
        )
        (reverse r)
    )
    
    • Vote tăng 1

  7. Đây bạn

     

    (defun C:to (/ tot_len ss e_name e_record e_type tenlayer)
    (setvar "cmdecho" 0)
    (prompt "\nBan hay chon cac doi tuong: line,arc,circle,polyline,ellipse,spline,... ")
    (prompt "\nDe tinh tong chieu dai cho tat ca cac doi tuong do!")   
    (setq tot_len 0.0)
    
    (setq  tenlayer (cdr (assoc 8 (entget (car (entsel "\nChon mau layer:"))))))
    (prompt "\nChon doi tuong tinh chieu dai:") 
    (setq ss (ssget (list (cons 8 tenlayer))))
    (if (null ss)
    (exit)
    )
    (while (> (sslength ss) 0)
    (setq e_name (ssname ss 0))
    (setq e_record (entget e_name))
    (setq e_type (cdr (assoc '0 e_record)))
    (cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
    (command "lengthen" e_name "")
    (setq tot_len (+ tot_len (getvar "PERIMETER")))
    (ssdel e_name ss)
    )
    ((wcmatch e_type "MLINE") (add_mline))	; Link sang Ham add_mline ***********************
    (e_type (ssdel e_name ss))
    )
    )
    (prompt (strcat "\nTong chieu dai cua cac doi tuong la: " (rtos tot_len 2 4)))
    (princ)
    (setq en (car (entsel "\nThay cho so : ")))
    (print tot_len)
      (setq elst (entget en))
      (setq elst (subst (cons 1 (rtos tot_len 2 3)) (assoc 1 elst) elst))
      (setq elst (append elst '((62 . 2))))
      (entmod elst)
    (setvar "cmdecho" 1)
    )
    
    
    
    • Vote tăng 2

  8. Cám ơn bác nguyentuyen6 quan tâm và giúp đỡ em, bác online muộn thế  :)

    Em mới dùng lisp của bác viết, nhưng kết quả vẫn chưa đúng bác ạ, cụ thể là:

    - Ở bước "chọn cọc" em chọn vào cọc H3 thì nó có hiểu là chọn vào giữa cọc không bác?

    - Ở bước "chọn phía cắm" ý em là mình chọn điểm đầu, điểm cuối của hướng đó, vì sẽ có những cọc bị xiên ạ

    - Khi insert ra block em thấy kích thước bị nhỏ đi và khoảng cách không đúng bác à.

    - Em muốn kết quả thể hiện luôn khoảng cách từ cọc đến block như trên hình vẽ bác ạ

    Hic, bác kiểm tra lại giúp em với. Cảm ơn bác nhiều!!!!!!! 

    Bạn down lại ở bài trên của mình nhé!

    Bạn chọn cọc H3 thì nó nhận là trung điểm của cọc.

    Khoảng cách không đúng là do mình quên tắt bắt điểm

    p/s: Thêm giá trị mặc định


  9. Bạn thử cái này, lưu định dạng .CVS

    Lệnh là "camcoc"

    Điểm chèn block đặt ở tâm nhé.

    Muốn chọn lại chỗ lưu file csv  dùng lệnh "fn"

    Muốn chọn lại block mẫu dùng lệnh "maublk"

    (vl-load-com)
    (defun c:fn ( / )
                (setq fn_camcoc (getfiled "Create Output File" "" "csv" 1))
    );;; end defun fi
    (defun c:maublk ( / camcoc_ten_blk1)
          (setq  camcoc_ten_blk1 (car (entsel "\nChon block ki hieu chen:")))
          (if (= (cdr (assoc 0 (entget camcoc_ten_blk1))) "INSERT")
            (progn
            (setq camcoc_ten_blk (cdr (assoc 2 (entget camcoc_ten_blk1))))
            (setq XscFactor (vlax-get-property (vlax-ename->vla-object camcoc_ten_blk1) 'XEFFECTIVESCALEFACTOR))
            (setq YscFactor (vlax-get-property (vlax-ename->vla-object camcoc_ten_blk1) 'YEFFECTIVESCALEFACTOR))
            )
            (alert "\nChua chon duoc block mau!")
          );;;end IF
    );;; end defun fi
    
    (defun c:camcoc ( / camcoc_gocquay COC EL1 GOC LIST_DON LIST_TONG OSMLAST PHIA_CAM PT10 PT11 PT_CHO_CAM_COC PT_MID TOA_DO_X TOA_DO_Y)
          (setq    OSMLAST    (getvar "osmode"))
          (setq list_tong (list)
          )
    (if (null camcoc_khoang_cach)      
        (setq camcoc_khoang_cach 5)
    )      
    (if (null camcoc_ten_blk)      
          (c:maublk)
    )
          ;(setq list_don (list))
    (if
          (setq  coc (car (entsel "\nChon coc:")))
          (progn
          (if (= (cdr (assoc 0 (entget coc))) "LINE")
              (progn
                  (setq pt_mid  ( mid (setq pt10 (cdr (assoc 10 (entget coc)))) (setq pt11(cdr (assoc 11 (entget coc))))));;;setq
              );;;progn
          );;;end IF
          ;(setq camcoc_khoang_cach (getreal "\nNhap khoang cach: "));;;setq
          ;(setq camcoc_khoang_cach (duy:xd_gts camcoc_khoang_cach camcoc_khoang_cach "\nNhap khoang cach: "))
          (setq camcoc_khoang_cach (duy:xd_gts gtn camcoc_khoang_cach "Nhap khoang cach:"))
          (setq phia_cam (getpoint pt_mid "\nChon phia cam: ") );;;setq
          (setvar "osmode" 0)
          (setq goc (angle pt_mid phia_cam))
          (setq pt_cho_cam_coc (polar pt_mid goc camcoc_khoang_cach));;;setq
          (setq camcoc_gocquay (RTD (- goc (/ pi 2))))
          (command "_.insert" camcoc_ten_blk pt_cho_cam_coc XscFactor YscFactor camcoc_gocquay)
          (setq el1 (entlast))
          ;(vlax-put-property (vlax-ename->vla-object el1) 'XEFFECTIVESCALEFACTOR XscFactor)
          ;(vlax-put-property (vlax-ename->vla-object el1) 'YEFFECTIVESCALEFACTOR YscFactor)
          (command "_.dimaligned" pt_mid (cdr (assoc 10 (entget el1))) (polar pt_mid (+ goc (/ pi 2)) 8))
          (setq toa_do_x  (rtos (cadr (assoc 10 (entget el1))) 2 3));;;setq
          (setq toa_do_y  (rtos (caddr (assoc 10 (entget el1))) 2 3));;;setq
          (setq list_don (list (rtos camcoc_khoang_cach 2 10) toa_do_y toa_do_x));;;setq
          (setq list_tong (append  list_tong (list list_don)));;;setq
          ;(princ list_tong);;;princ
    (while (null fn_camcoc)
                (c:fn)
    );;; end If
          (LM:WriteCSV list_tong fn_camcoc);      
          ;(startapp "explorer" fn)
          (setvar "osmode" OSMLAST)
            (princ)
          )    
    (progn
          (princ "\nChon chua dung");;;princ
    (princ)      
    )
    )
    );;; end defun c:camcoc
    (defun RTD (x) (/ (* x 180) pi) )
    (defun mid ( a b )
        (mapcar (function (lambda ( a b ) (/ (+ a b) 2.0))) a b)
    )
    (defun LM:writecsv ( lst csv / des sep )
        (if (setq des (open csv "a"))
            (progn
                (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (",")))
                (foreach row lst (write-line (LM:lst->csv row sep) des))
                (close des)
                t
            )
        )
    )
    
    ;; List -> CSV  -  Lee Mac
    ;; Concatenates a row of cell values to be written to a CSV file.
    ;; lst - [lst] list containing row of CSV cell values
    ;; sep - [str] CSV separator token
    
    (defun LM:lst->csv ( lst sep )
        (if (cdr lst)
            (strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
            (LM:csv-addquotes (car lst) sep)
        )
    )
    
    (defun LM:csv-addquotes ( str sep / pos )
        (cond
            (   (wcmatch str (strcat "*[`" sep "\"]*"))
                (setq pos 0)    
                (while (setq pos (vl-string-position 34 str pos))
                    (setq str (vl-string-subst "\"\"" "\"" str pos)
                          pos (+ pos 2)
                    )
                )
                (strcat "\"" str "\"")
            )
            (   str   )
        )
    )
    (defun duy:xd_gts (gtn gtmd mdich / gtn gtmd mdich)
    (or gtn (setq gtn gtmd))
    (setq gtn (cond ((getreal (strcat "\n" mdich " < " (rtos gtn 2 2) " >:")))(gtn)))
    gtn)
    
    • Vote tăng 1

  10. Lâu ngày không viết Lisp nên hôm nay động vào cái này hoa hết cả mắt ( dài + trình bày cẩu thả).

    Tạm chỉnh chọt thêm mấy cái nhỏ nhỏ đã update ở trang1. Bác nào thấy cần thiết thì down lại nhé.

     

    Cho em hỏi ngu tý. Nếu một bản vẽ em muốn in thành nhiều bản vẽ thì làm thế nào ?

     

     

    tuanchung90 hỏi câu này, cũng chính là câu mình đang muốn hỏi đó

     

    Các anh tranh thủ giúp em vụ này với, ngày nào cũng phải in 2 lần bản vẽ, thật là ức chế ak  :(

     

    Các bác down lại ở #1 nhé. Mình vừa thêm mục in nhiều bản vào.

     

    P/s:

    - Do chỉ dùng cad trên Model và không biết về LayOut nên bác nào dùng trong layout thấy không được cũng đừng hỏi nhé ( mình không biết để trả lời đâu ). sorry :unsure: :unsure: :unsure:

    • Vote tăng 1

  11. [ c#]

     

    Đoạn code dưới đây tạo ra 2 đường tròn :

     

    acCirc1 (5,0,0).............. bán kính : 5

    acCirc1 (0,5,0).............. bán kính : 7

     

    Rồi cho cả 2 vào: acObjIdColl (là 1ObjectIdCollection)

     

    acObjIdColl = new ObjectIdCollection();
    acObjIdColl.Add(acCirc1.ObjectId);
    acObjIdColl.Add(acCirc2.ObjectId);

     

    Các bác có cách nào sắp xếp thứ tự các ObjectId trong acObjIdColl theo trục X , hoặc Y, hoặc theo bán kính không?

    Ví dụ:

     Sắp xếp theo X: acObjIdColl = (acCirc1--->acCirc2)

     Sắp xếp theo Y: acObjIdColl = (acCirc2--->acCirc1)

     Sắp xếp bán kính  : acObjIdColl = (acCirc2--->acCirc1)

     

    using Autodesk.AutoCAD.Runtime;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.Geometry;
     public static void Test()
    {
      ObjectIdCollection acObjIdColl = new ObjectIdCollection();
     // Get the current document and database
      Document acDoc = Application.DocumentManager.MdiActiveDocument;
      Database acCurDb = acDoc.Database; 
     // Lock the current document
      using (DocumentLock acLckDocCur = acDoc.LockDocument())
      {
          // Start a transaction
          using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
          {
              // Open the Block table record for read
              BlockTable acBlkTbl;
              acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                           OpenMode.ForRead) as BlockTable;
              // Open the Block table record Model space for write
              BlockTableRecord acBlkTblRec;
              acBlkTblRec = acTrans.GetObject(acBlkTbl[blockTableRecord.ModelSpace],
                                              OpenMode.ForWrite) as BlockTableRecord;
              // Create a circle that is at (0,0,0) with a radius of 5
              Circle acCirc1 = new Circle();
              acCirc1.SetDatabaseDefaults();
              acCirc1.Center = new Point3d(5, 0, 0);
              acCirc1.Radius = 5;
              // Add the new object to the block table record and the transaction
              acBlkTblRec.AppendEntity(acCirc1);
              acTrans.AddNewlyCreatedDBObject(acCirc1, true);
              // Create a circle that is at (0,0,0) with a radius of 7
              Circle acCirc2 = new Circle();
              acCirc2.SetDatabaseDefaults();
              acCirc2.Center = new Point3d(0, 5, 0);
              acCirc2.Radius = 7;
              // Add the new object to the block table record and the transaction
              acBlkTblRec.AppendEntity(acCirc2);
              acTrans.AddNewlyCreatedDBObject(acCirc2, true);
    
     
    
              // Add all the objects to copy to the new document
              acObjIdColl = new ObjectIdCollection();
              acObjIdColl.Add(acCirc1.ObjectId);
              acObjIdColl.Add(acCirc2.ObjectId);
    
     
    
              // Save the new objects to the database
    
              acTrans.Commit();
    
          }
    }
    }
    

     


  12. Bạn ơi cho mình hỏi chút nhé:

    1, In pdf thì mình có in được nhiều file 1 lúc không hay phải chọn rồi in từng trang 1? Sao mình in thì hình như các file nó đè lên nhau nên kết quả chỉ có bản vẽ cuối cùng.

    2. Trong lisp của bạn thì độ dày nét in có chỉnh được ko ?

     

    Thanks bạn, lisp rất tiện dụng và hữu ích.

    Lisp rất tuyệt nhưng sao khi in PDF mình chỉ đường dẫn lưu file nhưng vào đó mở ra chẳng thấy gì cả ( vẫn cho preview)

     

    Đúng là phần in PDF có vấn đề. Khi nào có thời gian mình sẽ sửa lại ^^! .

    - Hiện h nó đang in PDF ra Folder chứa bản vẽ và bị ghi đè vào file cũ nếu trùng tên

    - Chỉnh nét in thì phải chỉnh trước khi dùng lisp. (vào plot của cad)

    - Lỗi không hiện thì bạn thử in mồi 1 lần bằng lênh Plot của Cad rồi dùng lisp xem đc ko. Cái này mỉnh cũng chả biết sửa ra sao.

    • Vote tăng 1

  13. Có phải ý bạn là: tạo đa giác lồi, có diện tích nhỏ nhất, chứa tất cả các điểm của lst (các điểm của lst có thể nằm ở đỉnh, nằm trên cạnh, hoặc nằm bên trong đa giác lồi, nhưng không được nằm ngoài)?

     

    Ý của mình giống hệt cái lisp mình post trên kia nhưng thay vì vẽ line lisp sẽ vẽ = lwpolyline. và khi gọi chỉ cần gọi: (dglo lst).

    lst: là list các tập hợp điểm.

    Các điểm trong list ko được nằm ngoài polyline này. Các đỉnh của Polyline này là điểm trong list đó.

     

    7377_cadviet.jpg


  14. Đây bạn:

    ......

     

    Hehe. sorry vì mình ko nói rõ ra về cái list.

    Khi gọi hàm con này với đối số là 1 list tập hợp các điểm thì sẽ cho ra 1 LWPOLYLINE là đa giác lồi có diện tích lớn nhất, Bạn có thể chạy thử lisp trên mình post để hiểu rõ hơn. Thank bạn.

     

    Mình chưa có Cad để thử lisp của bạn nhưng đọc nó thì mình thấy nếu trong lst mà các điểm xếp lộn xộn thì có thể kết quả ko đúng.


  15. Mình có được đoạn code này ở trang 10.

     

    (defun gocmin (p lst / goc gmin pluu)
     (foreach p1 lst
    (setq goc (angle p p1))
    (if (or (not gmin) (> gmin goc))
     	(setq gmin goc
    	pluu p1
     	)
    )
     )
     pluu
    )
    ;;;-------------------------------------------
    (defun SS-aobjlst (ss / c L)
     (setq c -1)
     (repeat (sslength ss)
    (setq L (cons (vlax-ename->vla-object (ssname ss (setq c (1+ c))))
    L
    	)
    )
     )
     (reverse L)
    )
    ;;;-------------------------------------------
    (defun entmkLine (p1 p2)
     (entmake (list '(0 . "line")
      (cons 10 p1)
      (cons 11 p2)
    )
     )
    )
    ;;;-------------------------------------------
    (defun c:dglo (/ ss objlst tap_ins pd pc pt pchk1 Lst)
     (command "undo" "be")
     (command "ucs" "")
     (setq ss (ssget '((0 . "POINT")))
    tap_ins (list)
     )
     (setq objlst (SS-aobjlst ss))
     (setq tap_ins (mapcar '(lambda (x) (vlax-get x 'Coordinates)) objlst))
     (setq tap_ins (mapcar '(lambda (x) (trans x 0 1)) tap_ins))
    (setq tap_ins (vl-sort tap_ins
    '(lambda (x y)
    (if (= (cadr x) (cadr y))
    (< (car x) (car y))
    (< (cadr x) (cadr y))
    )
    )
    )
    )
     (setq pd	(car tap_ins)
    pc	(last tap_ins)
    pt	pd
    pchk1 nil
     )
     (while (not (eq pchk1 pc))
    (setq lst (vl-remove pt tap_ins))
    (setq pchk1 (gocmin pt lst))
    (entmkLine pt pchk1)
    (setq pt pchk1)
     )
     (while (not (eq pchk1 pd))
    (setq lst (vl-remove pt tap_ins))
    (setq pchk1 (gocmin pt lst))
    (entmkLine pt pchk1)
    (setq pt pchk1)
    (foreach p tap_ins
     	(if (<= (cadr pt) (cadr p))
    (setq tap_ins (vl-remove p tap_ins))
     	)
    )
     )
     (command "undo" "en")
     (princ)
    )
    

     

    Các bạn giúp mình tạo 1 hàm con vẽ đa giác lồiLWPOLYLINE, kết quả trả về là entname của đa giác lồi vẽ bằng LWPOLYLINE

    cách gọi lệnh: (dglo lst)

    trong đó: dglo là tên hàm con. lst là list các tập hợp điểm.

    Thanks!


  16. Bác Tue_NV với bác DVH nói đúng. phải gán cho cái key "Mark" 1 hành động nó mới có ý nghĩa.

    Bạn gán cho nó cái (set_list) nên mỗi lần ấn thì thấy nó vẫn thế.

    VD: Mỗi lần tác động vày key Mark thì nó in ra màn hình chữ "abc"

    (defun set_list ()
     (start_list "Mark")
     (foreach x lstdata (add_list (car x)))
     (end_list)
     )
    
    (defun split (str delim / lst i)
     (while (setq i (vl-string-search delim str))
    (setq lst (cons (substr str 1 i) lst)
         str (substr str (+ 2 i)))
    )
     (setq lst (cons str lst))
     (reverse lst)
     )
    
    (defun getdata ()
     (setq f (open (findfile "H-Member.dat") "r") lstData nil)
     (while (setq Line (read-line f))
    (setq data (split Line "\t"))
    (setq lstData (cons data lstData))
    )
     (setq lstData  (vl-remove '("") (reverse lstData)))
     )
    
    (defun c:AISC (/ sublist lstdata data)        
     (vl-load-com)
     (getdata)
     (setq dcl_id (load_dialog "AISC.dcl")) 	; Load the DCL file.
     (if (not (new_dialog "AISC" dcl_id))       ; Initialize the dialog.
    (exit)                          	     ; Exit if this doesn't
    )
     (set_list)
     (action_tile "Mark" "(pickMark)")
     (start_dialog)
     (unload_dialog dcl_id)
     )
    (defun pickMark ()
    (print "abc")
    )

    • Vote tăng 1
×