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

thiep

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

    514
  • Đã tham gia

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

  • Ngày trúng

    48

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


  1. @ Thiep : Thực ra mình cần thuật toán cắt nhau, tức 2 đt cắt nhau chứ kg gối đầu vào nhau. Nếu 2 đt gối đầu vào nhau thì dùng thuật toán khác sẽ nhanh hơn. VD :

    (defun c:tentpoint( / ss i n name p10 p11 lis1 lis2)
     (defun diem( name n)
    (cdr (assoc n (entget name)))
     )
     (setq tg (getvar "millisecs"))
     (setq ss (ssget "x" '((0 . "line"))))
     (if ss (progn
    (setq i 0 L (sslength ss) lis nil n 0)
    (while (< i L)
     	(setq name (ssname ss i))
     	(setq p10 (diem name 10) p11 (diem name 11))
     	(if (null (assoc p10 lis1)) (setq lis1 (append lis1 (list (list p10)))) (if (null (assoc p10 lis2)) (progn
                                                                                                                                                     	(setq n (1+ n))
                    	(entmake (list (cons 0 "POINT") (cons 10 p10)))
                                                                                                                                                     	(setq lis2 (append lis2 (list (list p10))))))
     	)
     	(if (null (assoc p11 lis1)) (setq lis1 (append lis1 (list (list p11)))) (if (null (assoc p11 lis2)) (progn
                                                                                                                                                     	(setq n (1+ n))
                    	(entmake (list (cons 0 "POINT") (cons 10 p11)))
                                                                                                                                                     	(setq lis2 (append lis2 (list (list p11))))))
     	)
     	(setq i (1+ i))
    )
     ))
     (print (strcat " Mat thoi gian la: " (rtos (/ (- (getvar "millisecs") tg) 1000.0) 2 3) " giay de tao duoc " (itoa n) " points"))
    )
    

    Sau khi chạy thì : " Mat thoi gian la: 0.328 giay de tao duoc 871 points"

    @ bác Ha : bác thay dòng 20 ở dòng này thành 50

    (setq lis (select-c (getvar "extmin") (getvar "extmax") 20 '((0 . "LINE"))))

    tức 1 ô có 20 đt thành 1 ô có 50 đt

    Hi Ngamy, thuật toán của bạn nhanh hơn nhưng bị lỗi: lisp tentpoint không tạo điểm tại 2 vị trí (588354.256,1181945.211) và (588557.766, 1182018.526). Nếu bạn hoàn chỉnh lisp của bạn để tạo thêm 2 điểm ở trên nữa thì đúng 873 điểm!. Lúc đó thời gian chạy lisp sẽ khác ngay.

    • Vote tăng 1

  2. Cám ơn bác Thai.

    @Thiep : Hàm của Thiep như mình đã nói ở trước, nó kg chạy khi có đối tượng kg gối đỉnh vào nhau. Mình đã thử khi vẽ 2 line bất kỳ thì nó kg xét hai line này. Xem sơ qua cách viết của Thiep có lẽ trên bv nếu có line dài nhiều sẽ tốn thời gian hơn PP chia ô vì lúc đó nó sẽ chọn mỗi lần nhiều đối tượng hơn. PP chia ô nói chung sẽ ổn định nhất vì mình đã khống chế số đối tượng cho mỗi lần chọn. Tuy nhiên, vđ nằm ở giải thuật của bác Thai, làm sao tránh đc vòng lặp bị treo vì khi định số đối tượng trong 1 ô, nếu định nhiều quá làm chậm quá trình, định ít quá gây lỗi như đã nêu.

    Hi Ngamy, thiep đã chạy thử lisp của bạn có bị lỗi như sau:

    * không tạo điểm tại 2 vị trí: (588359.873,1182011.308) và (588557.769,1182018.526)

    : lỗi này do hàm intersectWith nó hiểu rằng 2 đoạn thẳng gần song song nhau sẽ gặp nhau ở vô cùng.

    * Một số điểm gần như trùng nhau:

    - tại vị trí (588434.466,1181927.813) có 2 điểm hầu như gần trùng nhau.

    - tại vị trí (588370.820,1181943.243) có 3 điểm hầu như gần trùng nhau.

    - tại vị trí (588343.175,1181971.641) có 5 điểm hầu như gần trùng nhau.

    : lỗi này cũng do intersectWith tạo ra khi nó hiểu rằng có 3, hay 4 đoạn thẳng hội tụ gần nhau tại 1 điểm mà không gặp nhau tại 1 điểm, thì nó tìm ra nhiều điểm giao như Thiệp đã đề cập bài trước.

    Còn Lisp của thiep không chạy khi có đối tượng không gối đỉnh vào nhau, là vì thiep không dùng phương thức intersectWith mà chỉ dùng thuật toán so sánh các điểm gần nhau : có 2 hay nhiều điểm nằm gần nhau trong phạm vi sai số fuzz thì loại bỏ hết chỉ còn 1 điểm để tạo point, hàm (ACET-LIST-REMOVE-DUPLICATES ). Bvẽ của bạn, thiep thử cho sai số fuzz = 0.002, lisp tạo ra 879 points. Sau khi phát hiện lisp của bạn có lỗi, quay lại bản vẽ, thiep phát hiện có 1 cạnh giải thửa có chiều dài 0.0375 (đo sai số chính xác thật!) và thiep thử cho sai số 0.03 thì lisp tạo ra chỉ có 873 points!!! Con số này có lẽ đúng nhất và lisp cũng chỉ chạy có 0,515"

    • Vote tăng 1

  3. Cám ơn Thiep. Chạy trên máy của mình, kết quả như sau :

    - của Thiep : " Mat thoi gian la: 0.672 giay de tao duoc 879 points"

    - của Ha kết hợp PP chia ô : " Mat thoi gian la: 0.578 giay de tao duoc 880 points"

    - cua Ha nguyên gốc : " Mat thoi gian la: 13.906 giay de tao duoc 880 points"

    - của một bạn kết hợp PP chia ô : " Mat thoi gian la: 1.203 giay de tao duoc 876 points"

    Nói chung của Thiep và của bác Ha có kết hợp PP chia ô chạy nhanh nhất và số lượng điểm như nhau. Những PP khác chậm hơn nhưng có số lượng điểm hơi khác. Có thể do hàm tìm giao của Cad cũng kg ổn định.

    Đây là code của bác Ha kết hợp PP chia ô của bác Thái.

    (defun c:HATG2 ( / lis i dt p1 p2 Tapchon)
    (defun GIAOSS-2 (ss / a i j objlst lst)
     (setq i (sslength ss))
     (setq objlst (SS->objlst-2 ss))
     (while (> (setq j (1- i) i (1- i)) -1)
    (setq a (nth i objlst))
    (while (> (setq j (1- j)) -1)
     	(setq lst (cons (NHOM3-2 (vlax-invoke a 'IntersectWith (nth j objlst) acExtendNone)) lst))
    )
     )
     lst
    ;  (print (LM:Unique-2 (apply 'append lst)))
    )
    (defun NHOM3-2 (lst / a B)
     (while lst
    (repeat 3
     	(setq a (cons (car lst) a) lst (cdr lst))
    )
    (setq b (cons (reverse a) B) a nil)
     )
     (reverse B)
    )
    (defun SS->objlst-2 (ss / i lst)
     (repeat (setq i (sslength ss))
    (setq lst (cons (vlax-ename->vla-object (ssname ss (setq i (1- i)))) lst))
     )
    )
    (defun LM:Unique-2 ( l )
     (if l (cons (car l) (LM:Unique (vl-remove (car l) (cdr l)))))
    )
     (setq tg (getvar "millisecs"))
     (setvar "osmode" 0)
     (setq lis (select-c (getvar "extmin") (getvar "extmax") 20 '((0 . "LINE"))))
     (setq i 0 liskt nil)
     (while (< i (length lis))
    (setq dt (nth i lis) p1 (car dt) p2 (cadr dt))
    (setq TapChon (ssget "c" p1 p2 '((0 . "line"))))
    (setq liskt (append liskt (Giaoss-2 TapChon)))
    (setq i (1+ i))
     )
     (setq liskt (LM:Unique-2 (apply 'append liskt)))
     (foreach x liskt (entmake (list (cons 0 "POINT") (cons 10 x))))
     (print (strcat " Mat thoi gian la: "
    (rtos (/ (- (getvar "millisecs") tg) 1000.0) 2 3)
    " giay de tao duoc " (itoa (length liskt)) " points")
     )
    )
    

    Hi NgaMy, Lisp của bạn còn thiếu 2 hàm con select-c1 và LM:UNIQUE, và cho kết quả là 880 points là chưa chính xác lắm. Chính xác là 879 points. ban đầu lisp của Thiep cho kết quả 881 points, Thiep rất mất thời gian điểm tìm ra nguyên nhân này và phải "mua" thời gian chạy lisp thêm 0,07" nữa đó!


  4. Mất 15'' Ha ơi.

    @ Thiep : Lisp của bạn vẫn còn lỗi cú pháp, bạn xem lại giúp nhé

    Thiep kg cần loại bỏ các kc có ss 0.5. Vì trên bv đó kg có TH như vậy. Chỉ cần khác 0.002m thì xem như là 0 trùng, cứ thoải mái insert vào đó 1 point

    Lisp của thiep đã chỉnh sửa nhờ sự góp ý của bạn và Thaistreetz, chạy không hơn 0,5" trên máy core ™2 Duo 2.8GHz, 2G Ram

    [/codebox] (defun c:cg (/ TapChon entlst lst tg Now Pstart Pend len n)

    (setq TapChon (ssget '((0 . "LINE")))

    entlst (ACET-SS-TO-LIST TapChon)

    lst nil

    )

    (setq tg (getvar "millisecs"))

    (setvar "cmdecho" 0)

    (setvar "osmode" 0)

    (command "undo" "be")

    (foreach ent entlst

    (setq Pstart (vlax-curve-getStartPoint ent)

    Pend (vlax-curve-getEndPoint ent)

    )

    (setq lst (append lst (list Pstart) (list Pend)))

    )

    (setq lst (ACET-LIST-REMOVE-DUPLICATES lst 0.002))

    (setq len (length lst)

    r 0.5

    n 0)

    (foreach Diem lst

    (setq p1 (polar Diem 0 r)

    p2 (polar Diem (/ pi 2) r)

    p3 (polar Diem pi r)

    p4 (polar Diem (/ (* 3 pi) 2) r)

    lstF (list p1 p2 p3 p4)

    )

    (setq ss (ssget "CP" lstF '((0 . "*LINE"))))

    (if (and ss (> (sslength ss) 1))

    (progn

    (entmake (list (cons 0 "POINT") (cons 10 Diem)))

    (setq n (1+ n))

    )

    )

    )

    (alert (strcat " Mat thoi gian la: "

    (rtos (/ (- (getvar "millisecs") tg) 1000.0) 2 3)

    " giay de tao duoc " (itoa n) " points")

    )

    (command "undo" "en")

    (princ n)

    (princ)

    ) [/codebox]


  5. Mất 15'' Ha ơi.

    @ Thiep : Lisp của bạn vẫn còn lỗi cú pháp, bạn xem lại giúp nhé

    Thiep kg cần loại bỏ các kc có ss 0.5. Vì trên bv đó kg có TH như vậy. Chỉ cần khác 0.002m thì xem như là 0 trùng, cứ thoải mái insert vào đó 1 point

    Hi NgaMy, với bản vẽ giải thửa của bạn, thiep lợi dụng ở chỗ là các LINE thường chỉ giao nhau ở điểm startpoint hay endpoint, còn nếu cùng lắm là chúng giao nhau hay chưa giao nhau với 1 khoảng cách từ điểm giao đến startpoint hay endpoint ví dụ = 0.002m. Như vậy không cần phải dùng phương thức "IntersectWith" chi cho tốn thời gian, mà chỉ cần tìm điểm startpoint hay endpoint nào gần nhau với sai số max thì loại khỏi cuộc chơi.


  6. Chào Thiep! Hình như ban đã sd điểm đầu và cuối để chèn cái point vào, điều này kg đúng yêu cầu. Bạn phải tìm điểm giao của chúng. Vì mình lười kg đưa một bv khác nên làm bạn hiểu nhầm. Vì bv này tất cà các line đều nối với nhau nhưng nếu mình đưa 1 bv khác thì Lisp của bạn sẽ chạy sai. Với lại 1 điểm giao bạn chỉ insert 1 point mà thôi

    Hi NgaMy, bạn cho 1 BV ví dụ trường hợp các line không gặp nhau tại endpoint hay startpoint đi. Sẽ có trường hợp các line cắt nhau và không cắt nhau, lúc này tìm điểm giao sẽ mênh mông lắm. Tại vị trí 3 line chụm đầu vào nhau mà đều cắt nhau, sẽ có trường hợp tìm được 3 điểm giao. Tại vị trí 3 line chụm đầu vào nhau mà không cắt nhau, giả sử có khoảng hở max là 0.5, sẽ có trường hợp tìm được 3 điểm giao mở rộng, lúc này biết lấy điểm nào?

    Lisp của thiep ở trên đã thực hiện với mỗi 1 điểm giao thì insert 1 point rồi mà


  7. Cám ơn bạn Ha đã hỗ trợ hết mình. Hôm nay mình có vđ này nhờ các bạn thử xem. Do đây kg phải là một ý tưởng bị bí nên mình kg đưa thành một chủ đề. Vđ thế này : Mình có down trên DD Cadviet một Lisp kg rõ của bạn nào (xin thứ lỗi), nó có chức năng tìm giao điểm của các đoạn thẳng (và nhiều loại đường khác) và đánh vào đó một Block, tuy nhiên, mình thay vào đó 1 point cho nó nhanh. Hiện tại nó chạy với bv mình đưa lên dưới đấy mất 3'43'', bạn nào có thể sd Lisp này và nâng cấp sao cho nó có thể chạy dưới 20''. Xin các bạn thử xem, đây là một vđ cải thiện tốc độ. Cám ơn các bạn.

    Hi NgaMy, lâu quá khg vào diễn đàn, thiep xin góp 1 lisp để giải trí, giải sầu một tí:

    (defun c:cg (/ TapChon entlst lst tg Now Pstart Pend len r p1 p2 p3 p4
       	lstF ss)
     (setq TapChon (ssget '((0 . "*LINE")))
    entlst (ACET-SS-TO-LIST TapChon)
    lst nil
     )
     (command "undo" "be")
     (setvar "osmode" 0)
     (foreach ent entlst
    (setq Pstart (vlax-curve-getStartPoint ent)
      Pend  (vlax-curve-getEndPoint ent)
    )
    (setq lst (append lst (list Pstart) (list Pend)))
     )
     (setq lst (ACET-LIST-REMOVE-DUPLICATES lst 0.01));
     (setq len (length lst)
    r 0.01)
     (foreach Diem lst
    (setq p1 (polar Diem 0 r)
      p2 (polar Diem (/ pi 2) r)
      p3 (polar Diem pi r)
      p4 (polar Diem (/ (* 3 pi) 2) r)
      lstF (list p1 p2 p3 p4)
    )
    (setq ss (ssget "F" lstF '((0 . "*LINE"))))
    (if (and ss (> (sslength ss) 1))
     	(entmake (list (cons 0 "POINT") (cons 10 Diem)))
    )
     )
     )
     (command "undo" "en")
     (princ len)
    )
    

    thời gian chạy 0.43"


  8. Viết giùm cho bạn đây luôn! Lần sau y/c thì phải ghi rõ ràng trên CADViet, chứ đừng gói nó vào 1 file như thế là không nên.

    Thân thương!

    ;Doan Van Ha - CADViet.com. 01/12/2011
    ;Noi cac block diem 3D thanh Polyline theo thu tu ten diem.
    (defun c:HA (/ lst)
    (vl-load-com)
    (command "undo" "be")
    (setq oldos (getvar "osmode"))
    (setvar "osmode" 0)
    (setq lst (acet-ss-to-list (ssget (list (cons 0 "insert")))))
    (setq lst (vl-sort lst '(lambda (x y) (<
    (atoi (cdr (assoc 1 (entget (entnext x)))))
    (atoi (cdr (assoc 1 (entget (entnext y)))))))))
    (command "3dpoly")
    (foreach x lst
     (command (cdr (assoc 10 (entget x)))))
    (command "")
    (setvar "osmode" oldos)
    (command "undo" "e")
    (princ))
    

    Chào Hà, rất may là bạn lấy giá trị của thuộc tính đầu trong block để sắp xếp thứ tự các ename của block. Nếu trường hợp giá trị cần so sánh để sắp xếp không rơi vào thuộc tính đầu "(assoc 1)" thì người dùng phải viết lại lisp thì cực lắm!

    Hãy để người dùng thêm tuỳ chọn là thuộc tính nào cần lấy giá trị so sánh để sắp xếp thì nó mới trọn vẹn lisp này.

    Ngoài ra khi đã sắp xếp được các ename trong lst rồi thì lọc tiếp để lấy tọa độ insert của block (assoc 10) cho vào 1 list (lst2), sau đó dùng hàm (ACET-PLINE-MAKE (list lst2)) thì lisp sẽ chạy nhanh hơn vì bỏ đươc các "command"!

    Thân ái!


  9. Không biết giờ này chị Huong259 và anh Thiep đang làm gì, ở đâu???

    Hôm nay ngày 11-11-2011, một ngày thật ý nghĩa.

    Anh Thiep vẫn ở đây, bên Cadviet đấy thôi. Vì công việc nên ít ghé thăm hằng ngày, không biết rằng topic này lại có bạn vẫn ghé thăm, Thông cảm cho AThiep nhé. Rồi topic này lại trôi qua theo thời gian. Huong259 thì không thấy về thăm Cadviet, cũng buồn thật. Cũng như Huong 259, nhiều bạn rất ít thậm chí không thấy về thăm như Haanh, MrVui ...

    Một chút thoáng buồn, thời gian trôi nhanh quá.

    • Vote tăng 2

  10.  

    thế bác cứ giúp em sửa cái lisp trên cũng đc ạ.làm sao cho nó chạy đc trên Cad là đc rồi. vì em ko biết nó sai chỗ nào cả ạ

    e ko cần phải cụ thể như tạo ra các mặt cắt trong Nova hay các phần mềm khác đâu. chỉ cần tạo ra hình chiếu mặt cắt như bác nói trên cũng đc ạ

    ;;;------------ve hinh chieu mat cat ------
    ;;;------------by THIEP /11/2011 ------
    (defun c:hmc (/ entl sel ss pa pb L0 L1 L2 Lstp)
     (vl-load-com)
     (command "undo" "be")
     (acet-sysvar-set
    (list "cmdecho" 0 "osmode" 0)
     )
     (while (not sel)
    (setq sel  (entsel "\nPick line mat cat: ")
      entl (car sel)
    )
     )
     (setq PA (vlax-curve-getStartPoint entl)
    PB (vlax-curve-getEndPoint entl)
    )
     (setq ss (ssget "F"
    (list pA pB)
    '((0 . "LWPOLYLINE,POLYLINE"))
    )
    L0 (acet-ss-to-list ss)
    L1 nil
    L2 nil
     )
     (foreach x L0
    (setq L1 (append L1 (list(vla-copy (vlax-ename->vla-object x)))))
     )
     (mapcar '(lambda (x)
     	(vla-put-Elevation x 0.0)
    )
      L1
     )
     (foreach ent L1
    (setq Lstp (acet-geom-intersectwith
     entl
     (vlax-vla-object->ename ent)
     0
      	)
    )
    (foreach P Lstp
    (setq L2 (append L2 (list P)))
     	)
     )
     (mapcar 'vla-Delete L1)
     (setq L2 (append (list pa) L2)
    L2 (append L2 (list pb))
    L2 (vl-sort L2 '(lambda (e1 e2) (< (car e1) (car e2))))
     )
     (ACET-LWPLINE-MAKE (list L2))
     (setq ss (SSADD (entlast) (SSADD)))
     (command ".move"
    ss
    ""
    pa
    (ACET-SS-DRAG-MOVE
     	SS
     	pa
     	"\nChon vi tri dat hinh chieu mat cat: "
    )
     )
     (ACET-SYSVAR-RESTORE)
     (command "undo" "end")
     (princ "\nChuc cac ban thanh cong! Thiep")
     (princ)
    )
    (princ "\nDung lenh HMC de bat dau!")
    

    Bạn dùng thử lisp trên nhé. Nó là trích đoạn (1 phần 10) của lisp vẽ MC từ bình đồ.


  11. bác có thể nói rõ hơn đc ko ạ.vì lisp này đã có người dùng và đã vẽ đc mặt cắt bình đồ rồi.em cũng từng gửi tin nhắn hỏi bác Hoành nhưng ko thấy hồi âm gì

    Lisp chỉ vẽ được hình chiếu của mặt cắt thôi. Hình chiếu ở đây là 1 polyline thẳng bon, có các nút là điểm giao của line mặt cắt và các đường contour. Chắc cái hồi năm 2007, bác Hoành chỉ hình tượng hoá cái mặt cắt là như vậy.

    Lisp vẽ mặt cắt không đơn giản chỉ có vài chục dòng mã như vậy được. Cỡ 400-500 dòng đó. Phải đầu tư nhiều sức lực lắm!


  12. -em có down lisp vẽ mặt cắt từ bình đồ của bác Hoành về dùng nhưng vừa Ap vào thì máy lại báo lỗi, mặc dù em đã làm đúng yêu cầu rồi, lỗi như sau:

     

    Command: ap APPLOAD 4292_vmc.lsp successfully loaded.

    Command: ; error: misplaced dot on input

    Command:

    em ko biết vì sao có lỗi này, mong các bác giúp đỡ cho ạ, lisp như sau:

     

     

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from http://www.cadviet.c...p?showtopic=812
    ;; Bien toan cuc deltaH
    (defun c:vmc ( / sel)
     .........
    

    Nhìn chung, nếu máy của bạn có chạy lisp này được hay không, thì lisp này cũng không thể vẽ mặt cắt từ bình đồ được đâu.


  13. thông số a là khoảng cách ban đầu của 2 đường bóng, đường biên đóng vai trò như 2 con dao cắt, đường bóng nằm trọn trong 2 biên đó.

    Chào hanam, theo mình nghĩ, các đường bóng này có các khoảng cách giản dần theo quy luật hình cos, cứ tưởng tượng nó giống như có một hình trụ tròn xoay có hai đầu là 2 hình gì đó, trên thân trụ có kẻ n đường đều nhau, bây giờ ta chiếu hình trụ và các đường kẻ này xuống hình chiếu bằng. Như vậy bài đặt ra chỉ có: chọn đường "dao cắt" thứ 1, chọn đường "dao cát thứ 2, enter số đường kẻ "n", Còn nếu đưa thông số "a", đường bóng cuối cùng tạo ra sẽ không còn trùng với đường thẳng nối 2 điểm cuối của 2 biên nữa?


  14. Cái đường tô bóng này thì là dân vẽ CAD là hiểu thôi ạ, khoảng cách giữa các đường tăng dần từ điểm M đến điểm N, còn quy luật tăng thế nào thì do người viết lisp tự định thôi ạ. Cái lisp của e nó cũng hơi hơi có điểm tương đồng với lisp Ctru mà anh Thiep giới thiệu. Yêu cầu của e được thể hiện rất rõ trong file ảnh đó ạ !

    Chào Hanam1210, các đường bóng phải song song với nhau, như vậy đường thẳng nối 2 điểm đầu và đường thẳng nối 2 điểm cuối của 2 biên phải song song nhau phải không? Còn thông số a để làm gì vậy?


  15. Em hay phải vẽ các đường bóng, tức là các đường thể hiện dốc trên mặt bằng ... hoặc thể hiện mặt con, mặt vát trên các hình chiếu đứng... Phải vẽ bằng thủ công rất mất thời gian. VẬy mong các anh chị trên diễn đàn viết giúp em caí lisp để vẽ các đường tô bóng để tất cả diễn đàn cùng sử dụng được không ạ ? Yêu cầu của em được minh họa rất cụ thể trong file ảnh em gửi kèm ạ. Chú ý rằng các đường bóng đó được đặt trong 1 layer riêng, và nó có màu 8.

    http://www.mediafire...t0isfet&thumb=4

    Em xin chân thành cảm ơn !

    Chào Hanam1210

    Bạn có thể tham khảo lisp này xem sao?

    http://www.cadviet.com/forum/index.php?showtopic=13087&view=findpost&p=71661


  16. Mình gửi các bác ảnh và bản vẽ để nắn ảnh

     

    http://www.cadviet.c...les/3/vd_14.rar

     

    Trong quá trình nắn ảnh việc lựa chọn nhiều điểm trên ảnh dùng để nắn vào các điểm trên bản vẽ là rất quan trọng vì nó liên quan đến độ chính xác.

     

    Lưu ý : Cho đến nay thì chưa có chương trình nào nắn ảnh chính xác một cách tuyệt đối cả, tất cả mới chỉ là tương đối.

     

    Rất mong các bác trên diễn đàn có thể phát triển Lisp Scale đối tượng thành lisp có thể phục vụ cho công việc nắn ảnh để anh em trắc địa đỡ vất vả trong công việc này.

    Xin cảm ơn !

    Hi Ngocthanh_2010,

    Cad Overlay chạy trên nền Cad tương ứng, có thể nắn ảnh lại rất tốt. Bạn nên tìm trên mạng tải về dùng. Học sử dụng phần mềm này cũng rất nhanh thôi mà. Ngoài nắn ảnh, Cad Overlay cũng có thể cắt ảnh, số hóa tự động, ....

    Chúc bạn vui.


  17. Bác Thiệp lại ra tay trượng nghĩa rồi. Chắc lâu roài bác cũng ko viết ấy nhở? Hic. Em cũng ngứa nghề quá bác ah. Muốn mót mà ko được, hic. Khi nào về em mót vậy.

    Chào thanhduan, đúng là lúc rày anh bận quá, cũng thường xuyên ghé cadviet, nhưng rất ít bài đăng. Khi đụng đến lisp của mình trước đây, mới ra tay một chút thôi. Thiêp cũng thường xuyên viết lisp phục vụ cho công việc riêng mình, ví dụ như bên trắc đạc sau khi ra được bản đồ đồng đẳng từ Surfer, có 1 số contuor không trơn lắm, không theo ý muốn, phải nắn lại, thì phải viết lisp thôi, rồi nội suy thêm contuor nữa v.v...

    @trangA, bạn hãy thêm dòng (or etrim (load "extrim.lsp")) vào đầu chương trình như Ketxu đề nghị và nên nhớ là Cad của bạn phải có cài thêm Express tools. còn cái vụ xóa lộn thì phải chờ bác thanhbinh chỉnh lại lisp 1 chút.


  18. Chào anpha3

    Trước hết, xin nhận xét:

    - cái đường bao quanh tim tuyến bản vẽ của bạn không phải do offset tim tuyến ra 2 bên, nó không cân đối qua tim tuyến

    - Trong bản vẽ có nhiều đối tượng nằm trùng với nhau,

    Vì vậy, trước khi sử dụng lisp Thiệp gửi đề nghị bạn như sau:

    - Dùng lệnh "overkill" để xóa hết các đối tượng trùng nhau,

    - Offset tim tuyến ra 2 bên theo ý bạn rồi nối chúng lại thành 1 đường bao,

    Thiep đã nâng cấp TRICHBD.LSP đê trích thửa bản đồ với các loại đường bao là: Square/Rectangle/Circle/Ellipse/Lwpolyline, trong bản vẽ của bạn với trích thửa là Lwpolyline (bạn chỉ cần đánh "L")

     

    http://www.cadviet.c...3/trichbd_1.lsp

     

    Sau khi chạy lisp, bạn scale bao nhiêu thì tùy bạn.

    @thanhbinh, lisp của bác chỉ chạy được khi trong bản vẽ đã từng sử dụng lệnh extrim, ngoài ra lisp của bác nó etrim lẫn lộn: có khi nó xóa các đối tượng trong đường bao đó!


  19. E nhầm, e lấy cái lisp này ở diễn đàn khác chứ ko fai ở cadviet. Ở cadviet e vào mà link nó die hay sao ý.

    Bác thử xem code này đúng chưa ạ?

     

     

    (defun c:pl2spl (/ ss sse npt)

    (if

    (setq ss (car (entsel "\nSelect a polyline object")))

    (progn

    (setq sse (entget ss))

    (setq npt (massoc 10 sse))

    (command "_erase" ss "")

    (command "_spline")

    (foreach x npt

    (command x)

    ) ; foreach

    (command "" "" "")

    ) ; progn

    (alert "\nInvalid selected object,please try again")

    ) ; if

    (princ)

    )

    bạn thử thay dòng (massoc 10 sse) bằng dòng (ACET-GEOM-VERTEX-LIST ss)

    và bỏ dòng (setq sse (entget ss))


  20. Hề hề hề,

    Ới bác chủ thớt ơi.......

    Thằng bé lại nhòm thấy cái ngồ ngộ như sau:

    Trên cái bản vẽ bác đã làm nháp, thử kiểm lại 3 điểm theo phương y ở góc dưới bên trái trên lưới điểm mà bác đã nội suy thì thấy như sau:

    H1 = 79.27

    H2 = 10.16

    H3 = 63.10

    Vi chi eq.latex?\Delta2H1 = 79.27 - 10.16 = 69.11

    eq.latex?\Delta2H2 = 10.16 - 63.10 = - 52.94

    Do đây là các điểm dốc ngược chiều nhau (H2 < H3 < H1) nên eq.latex?\Delta2Hmax = 69.11 + 52.94 = 122.05

    Vậy nếu như đơn vị đo cao độ trên bản vẽ của bác là mm thì nó thỏa mãn điều kiện của bác về độ gẫy (<= 0.16m = 160 mm)

    Còn nếu như bác lại vẽ với tỷ lệ 1/1000 thì 122.05 x 1000 = 122050 mm = 122.05 m. Vậy là sai với điều kiện đã cho bác ạ.

    Mà nếu bác dùng tỷ lệ 1:1 thì mình thấy hơi quái chiêu vì cái ô lưới bác chọn là 40 x 40 mm = 4 x 4 cm là quá nhỏ so với cái sân bay của bác và có cần tới dộ chính xác như vầy hay không.

    Hơn nữa với sai số cao độ cho phép là 160 mm trên kích thước ô 40 mm liệu có hợp lý không cà???

    Hề hề hề,

    Đúng là cái sân bay có khác, khó ghê....

    Chào bác Bình, cái bài toán này Thiep nhớ đến bài toán tìm tâm đường tròn 3D của Duyminh86, mà bác cùng với Duongtrunghuy, thiep cùng giải quyết.

    Theo Thiep nghĩ, bài toán yêu cầu tìm 1 mặt phẳng ngang có độ cao Z, sao cho tổng (hay tổng bình phương) các khoảng cách từ điểm đo chi tiết (điểm cao độ tự nhiên) đến mặt phẳng Z là nhỏ nhất. Nếu đúng vậy, chúng ta sẽ là (ủi) cái sân bay này dễ dàng hơn bác ạ.


  21. Đây thuộc các lỗi "oái oăm" trong lsp. Mời bạn đọc bài này:

    http://www.cadviet.com/forum/index.php?showtopic=44879

    Cảm ơn Hà, thì ra thì nhiều người cũng bị lỗi khó hiểu của hàm FIX. Thiep đã khắc phục nó bằng cách trước khi sử dụng nó, hãy nhân thêm số cần fix với 1.00001, cụ thể

    (setq delta (* 10 (- 80.8 78.5)))

    lisp trả về delta là 23.0

    (setq delta (fix delta))

    lisp trả về delta là 22, Tuy nhiên:

    (setq delta (fix (* 1.00001 delta)))

    hoặc

    (setq delta (fix (* 10.000001 (- 80.8 78.5))))

    lisp trả về delta là 23 !!!

    Đôi khi mình phải đánh lừa nó mới được. Khà, khà, khà.


  22. @bác Thiệp : theo em thì cái gì đã làm được bằng Entmake rồi thì không nên viết sang Vla nữa :), cái gì khó quá thì mới invoke như ý bác. Xét về mặt tốc độ thì entmake nhanh hơn Vla ^^

    Ơ cái bài viết mình đâu nhỉ? Chắc là lâu quá, ít ghé thăm Cadviet nên bài viết mình là rác mất rồi!

    @ketxu: Có thể entmake nhanh hơn Vl, nhưng cũng chỉ nhanh hơn 1 chút thôi, vì Vl hơi phức tạp hơn, Nhưng thói quen tạo đối tượng bằng Vl vì khỏi phải nhớ các con số DXF. Sau khi tạo OBJ xong chúng ta tạo thuộc tính của nó sau. Chính nhờ help trong VL cũng rõ hơn, nên mình đọc và tạo được các OBJ phức tạp mà entmake chịu bó tay.


  23. bạn cho mình hỏi? có đánh được stt với block ATT không

    vd mình có khung bv thế này

    http://www.cadviet.com/upfiles/3/danh_so_thu_tu.dwg

    ban danh' so tt jup minh` nhe'

    tức là làm sao để bạn thay thế được số kt (text ATT)thành từ kt-01 đến kt-10....vv :blink:

    Bạn nên tham khảo thêm hàm attout, attin. Dùng hàm attout để xuất các thuộc tính ra file txt, chỉnh sửa các thuộc tính trong file txt này. Xong, Dùng hàm attin để cập nhập lại giá trị thuộc tính mình muốn chỉnh sửa. Như vậy, bản vẽ có khung tên là 1 block có thuộc tính sẽ thuận lợi chỉnh sửa hơn nhiều.

    Chúc bạn thành công.

×