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

dangbaoduy1982

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

    17
  • Đã tham gia

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

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


  1. (vbao @ Sep 16 2007, 09:44 PM)

    Xin các anh trong diễn đàn giúp tôi file lisp tiện ích chia 1 tứ giác hoặc đa giác thành 2 phần P1 và P2 có diện tích khác nhau theo yêu cầu với đường ranh giới cho trước. Thanks

     

     

    Dùng thuật toán tìm kiếm nhị phân. Ví dụ Chia đa giác lồi DGL thành hai miền có tỉ lệ diện tích cho trước theo đường thẳng đứng với sai số cho trước (ds)

    Xác định điểm nằm trong đa giác.

    Tính diện tích đa giác với điểm trong đa giác đó(Tham khảo lisp tính dt đa giác bằng cách pick)

    Từ tỷ lệ dt => dt S1: phía trái đường thẳng đứng.

     

    Gọi diện tích phía trái đường thẳng đứng là S1p.

    Tìm hai đỉnh đa giác có Xmin và Xmax(hai điểm có khoảng cách xa nhất về hai phía của đường chia đa giác).

    Vòng lặp:

    B1:Tạo đường ranh giới X = 1/2(Xmin+Xmax).

    B2:Xác định điểm nằm trong đa giác về phía trái đường ranh giới.

    B3:Tính diện tích S1p.

    -Nếu S1p < S1 và |S1p - S1| > ds:

    Thiết lập lại Xmin là đường phân tách đa giác, trở về B1

    -Nếu S1p > S1 và |S1p - S1| > ds:

    Thiết lập lại Xmax là đường phân tách đa giác, trở về B1

    -Trường hợp còn lại |S1p - S1| <= ds:

    Thoát vòng lặp.

    X:chính là đường phân tách thẳng thẳng đứng chia đa giác thành hai miền có tỷ lệ cho trước.


  2. Theo mình được biết ứng dụng arx object được viết bằng ngôn ngữ C++, có sử dụng các lớp MFC Visual C++ nên phải nghiên cứu C, C++, Visual C++ trước khi nghiên cứu arx object. Một trong số ưu điểm khi lập trình ứng dụng arx object :

    Lập trình hướng đối tượng, có thể tạo ra những đối tượng tùy biến kế thừa từ những đối tượng sẵn có của Autocad. Có thể thêm những thuộc tính và phương pháp cho đối tượng mới, đồng thời kế thừa những thuộc tính và phương pháp đối tượng cha. Cho phép ghi dữ liệu trực tiếp lên file dữ liệu autocad (.dwg).

    Sử dụng con trỏ (pointer) trong C++, tạo khả năng viết chương trình linh hoạt hơn.

     

    Các bạn nào rành về arx object hãy chỉ mọi người với. Có rất nhiều người quan tâm...


  3. Cảm ơn anh giabach rất nhiều.

    Anh gia_bach và mọi người cho Tue_NV hỏi thêm về Addvertex-Method

    Tue_NV đã viết code như sau :

     

    (defun c:addvertex (/ doc Util pt1 obj)

    (vl-load-com)

    (setq obj (vlax-ename->vla-object(car(entsel "\n Pick chon PLINE :"))))

     

    (setq doc (vla-get-activeDocument (vlax-get-acad-object))

    Util (vla-get-utility doc))

     

    (setq pt1 (vla-getpoint Util nil "\nDiem them node : "))

    (vla-addvertex obj 1 pt1)

    (princ)

    )

     

    -> Kết quả báo lỗi :

    ; error: Automation Error. Incorrect number of elements in SafeArray

     

    Tue_NV nghĩ rằng lỗi này là do : sự không hợp lý về số của phần tử trong mảng.

    Không biết Tue_NV hiểu như thế có đúng không? Cách sửa lại đoạn code thì mình chưa tỏ tường lắm.

    Mong anh gia_bach và mọi người chỉ giúp. Tue_NV xin cảm ơn

     

    Bạn nghiên cứu đoạn mã này:

    (defun AddVertice(/)
     (setq Ent1Name (car (entsel "\nSeleccione una LwPolyline ")))
     (setq objPl (vlax-ename->vla-object Ent1Name)
      index nil
      index2 nil)
     (command "_osnap" "_nea")
     (while
     (setq pt1 (getpoint "\nSeleccione el punto a ingresar a la Lwpolyline "))
     (setq pt1 (reverse pt1))
     (setq Pt1XY (cdr pt1))
     (setq pt1XY (reverse Pt1XY))
     (setq saPt1 (vlax-make-safearray vlax-vbDouble '(0 . 1)))
     (vlax-safearray-fill saPt1 Pt1XY)
     (tramo)
     (vla-addvertex objPl index2 saPt1)
     )
     (command "_osnap" "_none")
     (setvar "cmdecho" 1)
     (princ)
    )
    
    (defun tramo (/ coords uno dos cnt)
     (setq coords (vlax-safearray->list (vlax-variant-value (vla-get-coordinates objPl)))
      uno (car coords)
      dos (cadr coords)
      coords (append coords (list uno))
      coords (append coords (list dos))
           cnt    0
      )
     (repeat (1- (/ (length coords) 2))
       (if (equal (angle (list (car coords) (cadr coords)) pt1XY) (angle (list (car coords) (cadr coords)) (list (caddr coords) (cadddr coords))) 1e-06)
         (setq index cnt
          index2 (1+ index)
          )
       )
       (setq coords (cddr coords)
             cnt    (1+ cnt)
       )
     )
    )
    
    (defun Nuevo()
     (setq Ent1Name (car (entsel "\nSeleccione una LwPolyline base para el nuevo poligono ")))
     (setq doc (vla-get-activeDocument (vlax-get-acad-object))
      mspace (vla-get-modelspace doc)
      objPl (vlax-ename->vla-object Ent1Name)
      coords (vlax-safearray->list (vlax-variant-value (vla-get-coordinates objPl)))
      temporal coords
      cnt 0
      ptin '()
      )
       (repeat (/ (length coords) 2)
         (setq este (car coords)
          norte (cadr coords)
          ptin (list este norte)
          )
         (setq mypunto (vla-addPoint mspace (vlax-3d-point ptin)))
         (vla-put-layer mypunto "Ptemp")
       (setq coords (cddr coords)
             cnt    (1+ cnt)
        )
         )
     (prompt "\nSeleccione los vertices del nuevo poligono  ")
     (setq puntos (ssget'((0 . "Point")(8 . "Ptemp")))
      num (sslength puntos)
      cont 0
      nnpt '()
      )
     (repeat num
       (setq coorpt (cdr (assoc 10 (entget (ssname puntos cont))))
        nnpt (append nnpt (list (car coorpt)))
        nnpt (append nnpt (list (cadr coorpt)))
        cont (1+ cont)
        )
       )
     (setq listann '()
      nnpt2 nnpt
      )
     (repeat (/ (length temporal) 2)
       (setq ptpl (list (car temporal)(cadr temporal))
        )
       (repeat (/ (length nnpt2))
         (setq ptnn (list (car nnpt2)(cadr nnpt2))
        )
         (if (equal ptpl ptnn)
      (setq listann (append listann ptnn))
      )
         (setq nnpt2 (cddr nnpt2))
         )
       (setq temporal (cddr temporal)
        nnpt2 nnpt
        )
       )
      (if (= (rem (length listann) 2) 0)
       (progn
         (setq
           tmp (vlax-make-safearray
                  vlax-vbDouble
                  (cons 0 (- (length listann) 1))
               )
         )
         (vlax-safearray-fill tmp listann)
         (setq myobj (vla-AddLightweightPolyline mspace tmp))
         (vla-put-closed myobj :vlax-true)
         (vla-put-layer myobj "NuevoPol")
         (vla-delete objpl)
       )
       (princ "\nerror: La polylinea no pudo ser creada")
     )
     (setq puntos (ssget "_x" '((0 . "Point")(8 . "Ptemp")))
      num (sslength puntos)
      cont 0
      )
       (repeat num
       (setq puntodel (ssname puntos cont)
        )
         (entdel puntodel)
         (setq cont (1+ cont)
          )
       )
     (setvar "cmdecho" 1)
     (princ)
    )
    
    (defun c:cpol (/ *osmode*)
     (vl-load-com)
     (PROMPT "\nPrograma para agregar o eliminar vertices de una Lwpolyline")
    (setvar "cmdecho" 0)
    (setq *osmode* (getvar "osmode")
         capa (getvar "clayer")
         )
     (command "_layer" "_m" "NuevoPol" "_c" "1" "" "")
     (command "_layer" "_m" "Ptemp" "_c" "2" "" "")
    (setvar "osmode" 0)
    (command "_undo" "_begin")
     (INITGET 0 "1 2")
     (SETQ S (GETKWORD "\nSeleccionar una opcion: 1=>Agregar 2=>Eliminar vertices :"))
     (WHILE (/= S NIL)
     (COND
       ((= S "1") (addvertice))
       ((= S "2") (nuevo))
       ((= S NIL) (SETQ S NIL))
       )
     (INITGET 0 "1 2")
     (SETQ S (GETKWORD "\nSeleccionar una opcion: 1=>Agregar 2=>Eliminar vertices :"))
     )
    (command "_undo" "_end")
    (setvar "osmode" *osmode*)
    (setvar "clayer" capa)
    (setvar "cmdecho" 1)
    (prin1)
    )
    

    • Vote tăng 1

  4. Nhân tiện, cho Thiep hỏi, các anh em nào hiểu rõ về hàm vlax-curve-getSecondDeriv như thế nào không ạ? Thiep nghĩ nó là giá trị đạo hàm bậc 2 tại 1 điểm trên Curve có phải không? Ứng dụng nó như thế nào? Nếu được cho mình 1 ví dụ.

     

    Bạn hãy test hàm này, mình tìm trên mạng. Khi test hãy chọn cung tròn hoặc cung tròn polyline

     

    (defun c:drawradius(/ ename pt1 curveobj deriv2 pt2)
     (mapcar 'set '(ename pt1) (entsel))
     (setq curveobj (vlax-ename->vla-object ename))
     (setq pt1 (VLAX-CURVE-GETCLOSESTPOINTTO curveobj pt1))
     (setq deriv2 (vlax-curve-getSecondDeriv
    			 curveobj
    			 (vlax-curve-getParamAtPoint curveobj pt1)
    			))
     (setq pt2 (mapcar '+ pt1 deriv2))
     (vlax-invoke
    (vla-ObjectIDToObject
      (vla-get-document curveobj)
      (vla-get-OwnerID curveobj))
    'addline pt1 pt2)
    )
    

    • Vote tăng 2

  5. Cách của dangbaoduy1982 không hay bằng hàm này đâu. Đó là hàm (vla-getbulge object index), hàm sẽ trả về độ lồi của đoạn cong trên polyline. G288 tạo vòng lặp với n là số node, khi nào (vla-getbulge object index) /= 0 có nghĩa là tại index đó có đoạn cong (arc)

    Từ lâu, thiep đã biết hàm này, bây giờ thiep mới reply, không biết có muộn màng không?

     

    Cảm ơn bạn Thiep, mình sẽ ứng dụng hàm này vào công việc của mình. Chắc là bạn đã biết rồi nhưng mình nói luôn ý nghĩa tham số độ cong:

    Là tỷ số giữa chiều đoạn thẳng nối hai trung điểm dây cung và cung tròn và chiều dài 1/2 dây cung đó. Nếu giá trị độ cong >0 : cung tròn polyline theo ngược chiều kim đồng hồ, ngược lại cùng chiều kim đồng hồ.

    • Vote tăng 1

  6. Chào các bạn. Mình có một cung tròn, Mình muốn chia nhỏ cung tròn này thành nhiều dây cung (dạng line hay pline) liên tiếp. Các bạn có biết trên cad có lệnh nào chia cung tròn thành nhiều dây cung hay không hoặc các bạn có thể viết giúp mình một cái lisp để làm việc này hay kg. Có hai lựa chọn :

    - Một là chia cung tròn thành n đoạn dây cung bằng nhau

    - Hai là chia cung tròn thành nhiều dây cung có độ dài cho trước (dây cung cuối cùng có độ dài còn lại)

    Mong đc các bác giúp đỡ. Xin cám ơn

     

    ;Chuyển spline hoặc polyline MO KHONG GIAO NHAU thành polyline có các phân đoạn bằng nhau

     

    (defun C:CDT(/ dt)

    (princ "\nChon Pline hoac SPline. ")

    (setq dt (getreal "\nNhap chieu dai phan doan : ")) ;CÓ THỂ THAY ĐỔI DÒNG NÀY thành (setq dt (getint "\nNhap so phan doan : "))

    (chpl (car(entsel)) dt)

    (princ)

    )

     

    ;Các hàm phụ

    (defun chpl (ent dt / name ptlst spt ept chkint elm)

    (setvar "CMDECHO" 0)

    (command "measure" ent dt) ;CÓ THỂ THAY ĐỔI DÒNG NÀY thành Divide với tham số dt là số phân đoạn//(command "Divide" ent dt)

    (setq name (cdr(assoc 0 (entget(entlast))))) ;ten doi tuong cuoi tren ban ve

     

    (while (and (/= name "SPLINE") (/= name "LWPOLYLINE") ;khi chua tim gap spline hoac pl

    (/= name "VIEWPORT")

    )

    (setq ptlst (append (list (assoc 10 (entget(entlast)))) ptlst)) ;dua toa do point vao danh sach bao gom dxf 10

    (entdel(entlast))

    (setq name (cdr(assoc 0 (entget(entlast)))))

    )

     

    (setq name (cdr(assoc 0 (entget ent)))) ;ten doi tuong chon (sp hoac pl)

    (if (= name "SPLINE")

    (progn

    (setq spt (car(spvexs ent))) ; toa do diem dau tien sp

    (setq ept (last (spvexs ent))) ; toa do diem cuoi sp

    )

    (progn

    (setq spt(car(plvexs ent 0))) ; toa do diem dau tien pl

    (setq ept (last (plvexs ent 0))) ; toa do diem cuoi pl

    )

    )

    (setq chkint (car(int spt (car ptlst) ept (last ptlst)))) ;dung ham int de tim giao diem

    ;2 : Hai doan thang ko // nhung ko cat nhau

    (if (or (= chkint 2)(= chkint 4)(= chkint 5)) ;4 : Hai doan thang nam tren 1 dthang nhung ko chong

    ;5 : Hai doan thang song song

    (setq ptlst (append (list(cons 10 spt)) ptlst (list(cons 10 ept)))) ;tao danh sach dinh

    (setq ptlst (append (list(cons 10 ept)) ptlst (list(cons 10 spt))))

    )

    (entmake (list '(0 . "POLYLINE") (assoc 8 (entget ent)))) ;tao doi tuong chinh

    (foreach elm ptlst

    (entmake (list '(0 . "VERTEX") elm)) ; tao field dinh

    )

    (entmake '((0 . "SEQEND"))) ;tao field ket thuc

    (entdel ent)

    (command "convert" "P" "S" (entlast)"")

    (princ)

    )

     

    (defun spvexs ( ent / lst ptlst newlst len i)

    (setq lst (member (assoc 11 (entget ent)) (entget ent))) ;Danh sach toa do diem bao gom header 11 moi danh sach con

    (setq num (length lst)) ; So ptu trong danh sach

    (setq i 0)

    (repeat num

    (setq ptlst (nth i lst)) ; lay ptu thu i trong danh sach.

    (setq ptlst (cdr ptlst)) ; loai bo header cua danh sach diem.

    (setq newlst (append newlst (list ptlst))) ;Tao ds moi ko co header.

    (setq i (+ i 1))

    )

    newlst

    )

     

    (defun plvexs (ent full / lst elm vexlst)

    (setq lst (member (assoc 10 (entget ent)) (entget ent))) ;Danh sach toa do co header 10 tro ve sau

    (setq lst (rmv_e (assoc 210 lst) lst)) ;Loai bo ma dxf 210

    (foreach elm lst

    (if (= (car elm) 10)

    (setq elm (cdr elm) vexlst (append vexlst (list elm)))

    )

    )

    (if (= full 0) vexlst lst)

    )

     

    (defun int (A B C D / INTER xA yA xB yB i j i1 temp)

    (if (equal (car C)(car D) 0.00005)

    (progn

    (setq temp A A C C temp)

    (setq temp B B D D temp)

    )

    )

    (setq xA (car A) yA (cadr A) xB (car B) yB (cadr B) xC (car C) yC (cadr C) xD (car D) yD (cadr D) )

    ;Pt tham so AB x = xA + (xB-xA)i

    ;Diem giao 2 duong thang thoa man he pt sau

    ; xA + (xB-xA)i = xC + (xD-xC)j va yA + (yB-yA)i = yC + (yD-yC)j

    ; Khu j duoc : bthuc Q*i=(xC-xA)*(yD-yC)-(yC-yA)*(xD-xC)

    ;voi Q = (xB-xA)*(yD-yC)-(yB-yA)*(xD-xC)

    (setq Q (-(*(- xB xA)(- yD yC))(*(- yB yA)(- xD xC))))

    (if (not(equal Q 0.0 0.00001)) ; hai duong thang cat nhau

    (progn

    (setq i (/ (-(*(- xC xA)(- yD yC))(*(- yC yA)(- xD xC))) Q)) ;tinh tham so i tai diem giao

    (setq j (/ (+(- xA xC)(*(- xB xA) i)) (- xD xC))) ;tinh tham so j tai diem giao

    (setq INTER (list (+ xA (* (- xB xA) i)) (+ yA (* (- yB yA) i)))); Diem giao

    (if (and (>= i -0.00001) (<= i 1.00001) (>= j -0.00001) (<= j 1.00001)) ; Neu diem giao thuoc 2 DOAN thang

    (progn (list 1 INTER)) ; tra ve diem giao

    (progn (list 2 INTER))

    )

    )

    (progn ; Q = 0 : hai duong thang song song hoac trung nhau

    ;Pt tong quat cua duong thang AB la : (yB-yA)*(x-xA) - (xB-xA)*(y-yA) = 0

    (setq bt (-(*(- yB yA)(- xC xA))(*(- xB xA)(- yC yA))))

    (if (equal bt 0.0 0.00001) ; 2 duong thang trung hoac chong nhau

    (progn

    (setq i (/ (- xC xA) (- xB xA))) ; Tinh tham so i tai diem C tren dt AB

    (setq i1 (/ (- xD xA) (- xB xA))) ; Tinh tham so i1 tai diem D tren dt AB

    (if (or (and (>= i 0.0) (<= i 1.0)) (and (>= i1 0.0) (<= i1 1.0)) (< (* i i1) 0.0)) ; neu 2 doan chong nhau

    (progn (list 3 nil))

    (progn (list 4 nil)) ;trung nhung ko chong

    )

    )

    (progn (list 5 nil)) ; Hai duong thang song song tra ve nil

    )

    ) ;dong progn else

    )

    )

     

    (defun rmv_e (e lst )

    (if (member e lst)

    (progn

    (cdr(member e lst));danh sach phia sau

    (reverse(cdr(member e (reverse lst))))

    (append (reverse(cdr(member e (reverse lst)))) (cdr(member e lst)))

    )

    nil

    )

    )

    • Vote tăng 1

  7. Chào các bạn. Mình có một cung tròn, Mình muốn chia nhỏ cung tròn này thành nhiều dây cung (dạng line hay pline) liên tiếp. Các bạn có biết trên cad có lệnh nào chia cung tròn thành nhiều dây cung hay không hoặc các bạn có thể viết giúp mình một cái lisp để làm việc này hay kg. Có hai lựa chọn :

    - Một là chia cung tròn thành n đoạn dây cung bằng nhau

    - Hai là chia cung tròn thành nhiều dây cung có độ dài cho trước (dây cung cuối cùng có độ dài còn lại)

    Mong đc các bác giúp đỡ. Xin cám ơn

     

    Chuyển spline hoặc polyline MO KHONG GIAO NHAU thành polyline có các phân đoạn bằng nhau.

     

    (defun C:CDT(/ dt)

    (princ "\nChon Pline hoac SPline. ")

    (setq dt (getreal "\nNhap chieu dai phan doan : "));CÓ THỂ THAY ĐỔI DÒNG NÀY thành (setq dt (getint "\nNhap so phan doan : "))

    (chpl (car(entsel)) dt)

    (princ)

    )

     

    ;Các hàm phụ

    (defun chpl (ent dt / name ptlst spt ept chkint elm)

    (setvar "CMDECHO" 0)

    (command "measure" ent dt) ;CÓ THỂ THAY ĐỔI DÒNG NÀY thành lệnh Divide với tham số dt là số phân đoạn//(command "Divide" ent dt)

    (setq name (cdr(assoc 0 (entget(entlast))))) ;ten doi tuong cuoi tren ban ve

     

    (while (and (/= name "SPLINE") (/= name "LWPOLYLINE") ;khi chua tim gap spline hoac pl

    (/= name "VIEWPORT")

    )

    (setq ptlst (append (list (assoc 10 (entget(entlast)))) ptlst)) ;dua toa do point vao danh sach bao gom dxf 10

    (entdel(entlast))

    (setq name (cdr(assoc 0 (entget(entlast)))))

    )

     

    (setq name (cdr(assoc 0 (entget ent)))) ;ten doi tuong chon (sp hoac pl)

    (if (= name "SPLINE")

    (progn

    (setq spt (car(spvexs ent))) ; toa do diem dau tien sp

    (setq ept (last (spvexs ent))) ; toa do diem cuoi sp

    )

    (progn

    (setq spt(car(plvexs ent 0))) ; toa do diem dau tien pl

    (setq ept (last (plvexs ent 0))) ; toa do diem cuoi pl

    )

    )

    (setq chkint (car(int spt (car ptlst) ept (last ptlst)))) ;dung ham int de tim giao diem

    • Vote tăng 1

  8. Có bác nào biết cách đổi hướng của 1 đường "Line" hoặc đường "Pline" chỉ cho e với.

     

    Lisp đảo ngược đỉnh đường Pline:

    ;Dao nguoc duong polyline

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (defun c:DGT( / plent)

    (setq plent (car(entsel"\nChon duong polyline can dao dinh : ")))

    (reverse_pl plent)

    (princ)

    )

     

    (defun rmv_e (e lst )

    (if (member e lst)

    (progn

    (cdr(member e lst));danh sach phia sau

    (reverse(cdr(member e (reverse lst))))

    (append (reverse(cdr(member e (reverse lst)))) (cdr(member e lst)))

    )

    nil

    )

    )

     

    (defun rpl (pos new lst / hdlst ltlst len count)

    (setq len (length lst) count 0)

    (repeat (- pos 1)

    (setq hdlst (append hdlst (list (nth count lst))));danh sach dau khong bao gom ptu thay the

    (setq count (+ 1 count))

    )

    (while (< count len)

    (setq ltlst (append ltlst (list (nth count lst))))

    (setq count (+ 1 count))

    )

    (setq hdlst (append hdlst (list new)))

    (setq ltlst (cdr ltlst))

    (append hdlst ltlst)

    )

     

    (defun plvexs (ent full / lst elm vexlst)

    (setq lst (member (assoc 10 (entget ent)) (entget ent))) ;Danh sach toa do co header 10 tro ve sau

    (setq lst (rmv_e (assoc 210 lst) lst)) ;Loai bo ma dxf 210

    (foreach elm lst

    (if (= (car elm) 10)

    (setq elm (cdr elm) vexlst (append vexlst (list elm)))

    )

    )

    (if (= full 0) vexlst lst)

    )

     

    (defun reverse_pl (ent / blglst lst hdlst rvslst swaplst prvlst elm len rp count)

    (setq lst (entget ent)) ;record pl

    (setq vexlst (plvexs ent 1)) ;ds cac dinh bao gom ma dxf 40,41,42

    (setq len (length (plvexs ent 1)))

    (setq rp (/ len 4) count 0) ;so dinh

    (repeat rp

    (setq blglst (cons 42 (- (cdr(nth (+ count 3)vexlst))))) ;doi dau do phinh co ma dxf 42

    (setq rvslst (append (list (nth count vexlst)(nth (+ count 1)vexlst) ;danh sach cac dinh dao nguoc

    (nth (+ count 2)vexlst) blglst) rvslst)

    )

    (setq count (+ 4 count));tang len vi tri diem ke tiep

    )

    (setq count 7);bat dau tu vi tri do phinh thu hai co ma dxf 42 cua dsach rvslst

    (while (< count (length rvslst)) ;khong phai la ma 42 dau tien va chua den cuoi dsach

    (setq swaplst (nth count rvslst)) ;lay ra danh sach con chua ma dxf 42

    (setq rvslst (rpl (+(- count 4)1) swaplst rvslst)); thay the ds con tai vi tri count-4

    (setq count (+ count 4)) ; vi tri danh sach chua ma dxf 42 ke tiep

    )

    (setq rvslst (rpl (+(- count 4)1) (cons 42 0.0) rvslst)) ;thay gia tri danh sach con dxf 42 cua dinh cuoi cung pline

     

    (setq count 0);bat dau tu phan tu thu nhat trong danh sach lst

    (while (/= 10 (car (nth count lst))) ;duyen record khi chua den toa do diem dxf 10

    (setq hdlst (append hdlst (list (nth count lst))))

    (setq count (+ count 1))

    )

     

    (setq lst (append hdlst rvslst)) ; tao lai record co dinh dao nguoc.

    (entmod lst); cap nhat record polyline

    )

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


  9. Tiện đây cũng hỏi luôn xem có bạn nào có ct hay hàm nào nhận biết đc một đoạn trong pline là thẳng hay cong ko?

     

    Đây là dữ liệu của một đường PL gồm một đoạn thẳng và một đoạn cong. Chú ý rằng mỗi đỉnh PL đều có mã DXF 42. Nếu giá trị mã này khác 0 thì phân đoạn ngay sau đỉnh đó là đoạn cong.

    ((-1 . ) (0 . LWPOLYLINE) (330 .

    7ef69cf8>) (5 . 224F32) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 .

    CAODODAYCONG) (100 . AcDbPolyline) (90 . 3) (70 . 0) (43 . 0.0) (38 . 0.0) (39

    . 0.0) (10 2391.15 -3135.52) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 2464.21

    -3061.75) (40 . 0.0) (41 . 0.0) (42 . -0.475185) (10 2609.54 -3075.87) (40 .

    0.0) (41 . 0.0) (42 . 1.92085) (210 0.0 0.0 1.0))

     

    Lệnh truy cập dữ liệu của một đối tượng:

    ;Ham xem du lieu doi tuong phuc

    (defun C:OBDT(/ ent)

    (setq ent (car(entsel "Chon doi tuong phuc : ")))

    (princ "\n")

    (while (/= (cdr(assoc 0 (entget ent))) "SEQEND")

    (princ (entget ent))

    (setq ent(entnext ent))

    (princ "\n")

    )

    (princ (entget ent))(princ)

    )

    ;Truy du lieu doi tuong

    (defun C:OBDT1(/ ent)

    (setq ent (car(entsel "Chon doi tuong : ")))

    (princ "\n")

    (princ (entget ent))

    (princ)

    )


  10. Theo mình được biết, Nova tạo lưới tam giác dưới dạng các đối tượng "3D FACE". Vì vậy bạn chỉ cần viết các hàm như sau.

    Hàm: Xác định một điểm có nằm trong hình chiếu của "3D FACE" lên mặt phẳng xoy ko?

    Hàm: Tìm giao điểm giữa đường thẳng song song trục z và mặt phẳng tạo bởi ba điểm trong không gian. Thành phần z của giao điểm này chính là cao độ cần tìm.

    Dùng cách duyệt thứ tự qua tập hợp "3D FACE" để tìm cao độ. Bạn xem thử cái này xem sao.

    http://www.cadviet.com/upfiles/2/demoluoit...reen_stream.rar


  11. Dư liệu chương trình thiết kế cống như sau:

    Các đối tượng trong chương trình gồm có:

    Đối tượng “INSERT” hố ga(nhiều loại) : khi tạo trên bản vẽ nó trở thành các BLOCK thuôc tính.

    Đối tượng “INSERT” góc tuyến cống : khi tạo trên bản vẽ nó trở thành các BLOCK thuôc tính tương ứng với mỗi tuyến cống.

    Đối tượng “INSERT” đường cong bằng (trong giao thông) : khi tạo trên bản vẽ nó trở thành các BLOCK thuôc tính tương ứng với mỗi tuyến đường ứng với mỗi tuyến cống nếu có.

    Đối tượng “INSERT” tham số cống(nhiều loại) : KHÔNG tạo trên bản vẽ, chỉ dùng để lấy các thông số cho các hố ga.

    ** Các “INSERT” được tạo tự động từ file text(theo qui ước của chương trình) mỗi khi Load chương trình.

     

     

    link: http://www.cadviet.com/upfiles/2/binh_do.dwg


  12. Mình đã viết hoàn thành chương trình thiết kế cống hoàn toàn bằng AutoLisp. Chương trình thực hiện được một số công việc sau:

    Bố trí hố ga trên bình đồ (đường PL tuyến cống có thể bao gồm cả đường cong), thông qua k/c cộng dồn tính từ đầu tuyến cống. Có thể bố trí một hố hoặc nhiều hố.

    Tính toán các thông số hố ga trên bình đồ(Cao độ đỉnh hố, Cao độ mặt đất tư nhiên, cao độ tim đường ứng với tuyến cống nếu có)

    Vẽ trắc dọc đáy cống, Vẽ bảng trắc dọc cống. Có thể thay đổi bảng trắc dọc về số lượng, chiều cao, thứ tự sắp xếp các dòng dữ liệu trong bảng trắc dọc

    Có thể hiệu chỉnh bất kỳ tham số nào của chương trình(bằng lệnh của chương trình, không phải lệnh AutoCad)

    Sau khi tính toán, có thể xuất dữ liệu thô (Các loại cao độ, lý trình hố ga theo tuyến cống hoặc theo tim đường, đường kính cống, loại hố ga) sang excel dùng để tính khối lượng.

    Tra lý trình trên đường PL. Nếu pick một điểm, lệnh cho biết lý trình hình chiếu điểm đó trên đường PL. Nếu nhập lý trình, lệnh tìm ra điểm tương ứng lý trình đó trên đường PL.

     

    Dữ liệu của chương trình được lưu dưới dạng block thuộc tính. Do đó có thể đóng mở bản vẽ nhưng dữ liệu vẫn được bảo toàn.

    Có thể thiết kế nhiều tuyến cống trên cùng bản vẽ.

     

    link: http://www.cadviet.com/upfiles/2/binh_do.dwg

×