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

qh2qa06

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

    68
  • Đã tham gia

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

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


  1. Trình bày hơi phức tạp nên em đã trình bày chi tiết trong file đính kèm.

    Với các mặt bằng có cùng một dạng biến thiên, để tiện cho thiết kế và thi công, bọn em thường gộp các thanh thép vào cùng một loại, sau đó thống kê chiều dài trung bình để tính khối lượng; tính ra DL để cắt thép. Sau khi có DL thì chiều dài thanh số 1=Lmin, thanh số 2=Lmin+DL, thanh số 3=Lmin+2DL... cứ như thế cho đến hết các thanh.

    Hiện bọn em thống kê phải nhập vào Excel và tính ra Ltb, tính ra DL rồi copy dán vào trong Cad, rất mất thời gian.

    Em xin cảm ơn!http://www.cadviet.com/upfiles/3/64018_tinh_chieu_dai_thanh_thep_trung_binh.dwg


  2.  

    Bạn dùng cái này. Nó chỉ hỏi 1 lần thôi.

     

    (defun c:cca (/ ss sstk sstn sscc v cdtk tm cc cdtn tm1)
      (defun dxf (id v) (cdr (assoc id (entget v))))
      (defun gan(v l)
       (car (vl-remove-if-not '(lambda(x) (< (distance (dxf 10 v) (dxf 11 x)) 1)) l))
      )
      (if (not laylist)
        (setq laylist (cons (dxf 8 (car (entsel "\nChon doi tuong thuoc layer Cao do thiet ke :"))) laylist)
     laylist (cons (dxf 8 (car (entsel "\nChon doi tuong thuoc layer Cao do tu nhien :"))) laylist)
     laylist (cons (dxf 8 (car (entsel "\nChon doi tuong thuoc layer Chenh cao :"))) laylist)
        )
      )      
      (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex
    (ssget "X" (list '(0 . "TEXT") (cons 8 (strcat (car laylist)"," (cadr laylist) "," (last laylist))))))))
    sstk (vl-remove-if-not '(lambda(x) (= (dxf 8 x) (last laylist))) ss)
    sstn (vl-remove-if-not '(lambda(x) (= (dxf 8 x) (cadr laylist))) ss)
    sscc (vl-remove-if-not '(lambda(x) (= (dxf 8 x) (car laylist))) ss))
    (while sstk
     (setq v (car sstk)
           sstk (cdr sstk)
           cdtk (atof (dxf 1 v))
           tm (gan v sstn)
           cc (gan v sscc))
     (if (and tm cc)
        (setq cdtn (atof (dxf 1 tm))
     sstn (vl-remove tm sstn)
     sscc (vl-remove cc sscc)
     tm1 (entmod (subst (cons 1 (rtos (- cdtk cdtn) 2 3)) (assoc 1 (entget cc)) (entget cc)))
      )
     )
    )
    (princ)
    )
    

    Em cảm ơn anh!


  3.  

    Thật ra không phải do lsp mà là do 2 cái pline của bạn có chiều dài khác nhau dù rất nhỏ. Bạn cho luprec = 8 rồi nhấp vào từng pline rồi ctr-1 sẽ thấy length khác nhau. Và vì vậy nên khi nhân độ dốc sẽ khác nhau (cũng do vấn đề làm tròn số) dù chỉ 1 mm.

    Tôi sửa lại lsp để khử cái vụ chênh nhau 1 chút đó.

     

    (defun c:ddo( / a b txt tt1 sole dd1 vt)
      (defun dxf (id v) (cdr (assoc id (entget v))))
      (defun ator (a sl) (atof (rtos a 2 sl)))
      (setq a (getpoint "\nChon diem da biet cao do: ")
           txt (car (entsel "\nText cao do tuong ung: "))
           tt1 (dxf 1 txt)
           sole (if (setq vt (vl-string-search "." tt1)) (- (strlen (substr tt1 vt)) 2) 0)
           dd1 (getreal (strcat "\nNhap do doc (+ len; - xuong) <" (rtos (if (not dd) (setq dd 0.01) dd)) ">: ")))
     (if dd1 (setq dd dd1))
     (while (setq b (getpoint a "\nChon diem can tinh cao do: "))
      (entmake (list '(0 . "TEXT") (cons 10 b) (cons 11 b) (cons 40 (dxf 40 txt)) (cons 41 (dxf 41 txt))
     (cons 8 (dxf 8 txt)) (cons 62 (if (dxf 62 txt) (dxf 62 txt) 256))
     (cons 7 (dxf 7 txt)) (cons 72 (dxf 72 txt)) (cons 73 (dxf 73 txt)) '(50 . 0)
     (cons 1 (rtos (+ (atof (dxf 1 txt)) (ator (* dd (ator (distance a b) sole)) sole)) 2 sole))))
     )
     (princ)
    )
    

    Những kiến thức chuyên sâu thế thì em không xử lý được. Lisp  anh sửa cho em dùng không bị lỗi thế rồi.

    Em cảm ơn anh!


  4. Trong quá trình dùng lisp ddo em gặp một lỗi gây lệch 0.001. Không lệch nhiều nhưng trên toàn bộ bản vẽ (dài 3000m, 20m/cọc) thì nhìn cực kỳ khó chịu. Em cũng không biết lỗi tại đâu. Em up lên đây nhờ các bác kiểm tra giúp.

    Nếu giữ tại đúng vị trí mắt lưới thì bị lệch. Em move để kiểm tra ra 2 vị trí cạnh nhau thì lại không lệch.

     

    http://www.cadviet.com/upfiles/3/64018_kiem_tra_lisp_ddo.dwg


  5.  

    - bạn cứ test thử nhiều trường hợp có lỗi pm nhoc hen ^^

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from http://www.cadviet.com/forum/topic/13750-lisp-tinh-gia-tri-trung-binh-cua-cac-text/page-3
    (defun mktext (point height string justify style  mau / lst)
    (setq lst (list '(0 . "TEXT")
                                  (cons 10 point)
    							  (cons 40 height)
    							  (cons 7 style)
    							  (cons 1 string)
    							  (cons 62 mau)
    			)
    			justify (strcase justify))
    		(cond   ((= justify "L") (setq Lst (append Lst (list (cons 72 0) (cons 11 point)))))
    		        ((= justify "C") (setq Lst (append Lst (list (cons 72 1) (cons 11 point)))))
    				((= justify "R") (setq Lst (append Lst (list (cons 72 2) (cons 11 point)))))
    				((= justify "M") (setq Lst (append Lst (list (cons 72 4) (cons 11 point)))))
    				)
    	(entmakex Lst)
      )	;end mktext
    ;;;;
    (prompt "Lenh tinh trung binh cong cac so: TBCC")
    (defun C:tbcc(/ c tong mstbc num ss pt ctext kq old sty)
    (setq old (getvar "osmode"))
    (setq sty (getvar "textstyle"))
    (setq c -1 tong 0 mstbc 0)
    (if (setq ss (ssget '((0 . "TEXT"))))
     (progn
        (while (setq ename (ssname ss (setq c (1+ c))))
          (if (setq num (distof (cdr (assoc 1 (entget ename)))))
    	      
              (setq tong (+ tong num) mstbc (1+ mstbc))
          );if
    	  (if ename
    	  (progn
    	  (setq ctext (cdr (assoc 40 (entget ename))))
    	  ;(setq glayer (cdr (assoc 8 (entget ename))))
    	  ;(setq gstyle (cdr (assoc 7 (entget ename))))
    	  )
    	  )
    	  
        );while
    	
    	
    	(if (null (zerop mstbc))
    	(progn
    	(setq kq (/ tong mstbc))
    	(setvar "osmode" 0)
    	(setq pt (getpoint "\nchon diem dat ket qua:"))
        (mktext pt ctext (rtos kq 2 3) "L" sty 1)
         );progn
        );if	 
    	
      );progn
      (alert "\nChua co doi tuong dc chon hoac ban chi chon toan text chu ^^")
    );if    
    (setvar "osmode" old)
    (princ)
    )
    
    

    Cảm ơn bạn! Mình kiểm tra sơ bộ thấy kết quả tốt rồi.


  6. Gõ lệnh một phát là có kết quả luôn, kỳ diệu quá!

     

    Thì sửa cái lsp trên 1 chút, nhưng ở đây thấy có 3 số lẻ và không nhân 100.

     

    (defun c:cca (/ ss sstk sstn sscc v cdtk tm cc cdtn tm1)
      (defun dxf (id v) (cdr (assoc id (entget v))))
      (defun gan(v l)
        (car (vl-remove-if-not '(lambda(x) (< (distance (dxf 10 v) (dxf 11 x)) 1)) l))
      )
      (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex
    (ssget "X" '((0 . "TEXT") (8 . "CDTN,CDTK,CC"))))))
    sstk (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTK")) ss)
    sstn (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTN")) ss)
            sscc (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CC")) ss))
      (while sstk
        (setq v (car sstk)
     sstk (cdr sstk)
     cdtk (atof (dxf 1 v))
     tm  (gan v sstn)
     cc  (gan v sscc))
        (if (and tm cc)
           (setq cdtn (atof (dxf 1 tm))
        sstn (vl-remove tm sstn)
        sscc (vl-remove cc sscc)
        tm1 (entmod (subst (cons 1 (rtos (abs  (- cdtn cdtk)) 2 3)) (assoc 1 (entget cc)) (entget cc)))
        )
        )
      )
      (princ)
    ) 
     
     
    

    Nhưng layer để tính sẽ phải là CDTK, CDTN và CC đúng không ạ?

    Em cảm ơn bác!

    Bác ơi giá trị CC = CDTK-CDTN. Lisp của bác đang tính là lấy số lớn trừ số nhỏ nên kết quả tính không đúng trên toàn bộ mặt bằng. Kết quả Chênh cao của em có cả giá trị âm (-), dương (+) và 0. Âm là đào, dương là đắp.


  7. Em cũng cần tính chênh cao nên em post luôn vào đây.

    Em đã có Text Cao độ Thiết kế và Text Cao độ tự nhiên. Bây giờ em cần tính Chênh cao và điền luôn vào cùng vị trí điểm tính ra, điền tự động luôn ạ. Các bác giúp em được không?

    Em xin cảm ơn ạ!

     

    http://www.cadviet.com/upfiles/3/64018_tinh_chenh_cao_cua_2_tap_hop_cac_diem.dwg


  8. Các bác cho em hỏi trong Land có thể tính chênh cao giữa 2 surface (bề mặt) không?

    Em có một bề mặt là Cao độ tự nhiên (CĐTN), 1 bề mặt là Cao độ thiết kế (CĐTK). Bây giờ em chạy cần xác định Cao độ thiết kế tại một số điểm, Cao độ tự nhiên tại cùng các điểm đó và chênh cao = CĐTK - CĐTN. Có cách nào để Land tự động tính chênh cao không?


  9. - hihi chào mừng bạn trở lại ^^, bạn mún 1 lsp chuẩn theo ý bạn, trước hết nhoc mún pit yêu cầu và mục đích cụ thể của bạn là gì

    - 1 tính trung bình cộng các số ok vấn đề đã đc giải quyết

    - 2 phần râu ria ^^

     + bạn mún tính các số trong đó có bao gồm các text có chứa chữ trong đó ko (chắc là ko ^^)

     + phần quét chọn bạn có lọc ra riêng các text số cần tính không như file ví dụ bạn đưa, hay trên bản vẽ có vô vàn đối tượng và các text cao độ nằm rãi rác và bạn mún quét toàn bộ bản vẽ

     + các text cao độ bạn chọn có cùng chung 1 layer, 1 kiểu textstyle, chung độ cao chữ ko

     + text xuất kết quả bạn mún nó có thuộc tính như thế nào nào có chung thuộc tính với các text đã  chọn đó ko, hay bạn mún nó thuộc 1 layer riêng, 1 style riêng, 1 chiều cao khác, 1 màu khác, hay edit vào text có sẵn, hay đơn giản hơn sao cũng đc chỉ cần ra đúng kết quả để kiểm tra gì đó

    - dựa trên mục đích của bạn nhoc sẽ cố gắng gôm lại 1 cục cuối cùng ^^

     

    - Phần quét chọn mình sẽ quét duy nhất số, nếu có lẫn chữ hãy báo lỗi cho mình.

    - Các text cao độ mình chọn chưa chắc đã có chung 1 layer, 1 kiểu textstyle, 1 độ cao. Theo mình lisp sẽ tính cho tất cả các đối tượng lựa chọn có dạng là text số.

    - Text xuất ra có thuộc tính là Layer, Textstyle đang hiện hành là được.

     

     Phức tạp quá nhỉ. Hôm nay hứng lên vào diễn đàn xem, thấy topic tăng thêm 2 trang, giật cả mình :D


  10.  

    nhoc có 1 lsp mót chỉnh sữa lại 1 tí theo ý bạn, bạn xem sao ^^

    ;;;Dung de tinh tong cac so
    (defun C:tbcc()
      (setq ss (ssget '((0 . "TEXT"))))
      (setq c 0 tong 0)
      (if (/= ss nil)
        (while (< c (sslength ss))
          (setq oldob (entget (ssname ss c)))
          (setq txtstr (assoc 1 oldob))
    	  (setq realk (assoc 40 oldob))
    	(if (/= txtstr nil)
            (progn
    		  (setq ctext (cdr realk))
              (setq num (cdr txtstr))
              (setq tam (atof num))
              (setq tong (+ tong tam))
    		  (setq tbc (/ tong (sslength ss)))
            );progn
          );if
          (setq c (1+ c))
        );while
      );if
      (while (/= tong 0)
        (setq p (getpoint "\nNhap vi tri xuat ket qua: "))
        (command "TEXT" p ctext 0 (rtos tbc 2 3) "")
        (setq tong 0)
      );while
    )
    (prompt "ten lenh : tbcc")
    
    

    Cảm ơn bạn! Lisp của bạn mình dùng tốt rồi. Phản ứng nhanh thật! Không thấy có icon tặng hoa hay vỗ tay gì cả 


  11. Nếu chủ thớt không đưa file thì tôi cũng phải hỏi lại giống như bác Bình nói, nhưng do có file thì cứ theo file mà làm thôi. Chắc đường pline là đường dẫn cao độ từ điểm đầu này tới điểm đầu kia thôi chứ không có điểm trung gian.

    Em cảm ơn anh! Lisp anh viết sử dụng tốt rồi ạ!

     

    Em thiết kế mặt bằng, cần lisp này để tính độ dốc giữa 3 điểm, từ đó khống chế độ dốc.

    Dùng lisp này, khi thiết kế mặt bằng với Land sẽ cho một mặt phẳng mượt, không có kiểu, chỗ này no dồn, chỗ kia đói góp.


  12. Hề hề hề,

    Bác Tot77 có quan tâm tới việc vị trí của các text cao độ không tướng ứng với điểm đầu và điểm cuối của pline không ạ.???

    Text của em định dạng Left, nằm đúng tại 2 đầu Polyline đấy bác ạ!

    Hơn nữa nếu chỉ tìm độ dốc giữa 2 điểm nằm trên PL thì em sẽ vẽ đường PL giữa 2 điểm đó. Làm cả một mặt bằng cả nghìn điểm còn được, vẽ thêm 1 đường PL là chuyện nhỏ :D


  13. Anh chỉnh cho em độ dốc được viết vào bản vẽ dưới dạng text và là % được không? VD trong file em đính kèm, độ dốc sẽ được viết vào là 1.41%.

    Anh giúp em độ dốc viết vào có 3 số sau dấu phảy, như trên là 1.411% chẳng hạn.

    Em cảm ơn ạ!

     

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

     

    (defun c:dd(/ t1 t2 pl dai)
      (setq t1 (car (entsel "\nChon text cao do 1:"))
    t2 (car (entsel "\nChon text cao do 2:"))
    pl (car (entsel "\nChon polyline:"))
    dai (vlax-curve-getDistAtParam pl (vlax-curve-getEndParam pl)))
      (princ (strcat "\nDo doc : " (rtos(/ (- (atof (cdr (assoc 1 (entget t1))))
                                (atof (cdr (assoc 1 (entget t2))))) dai))))
      (princ)
    )
    

  14. Mình muốn xin lisp tính độ dốc giữa 2 điểm không nằm trên một đường thẳng mà trên một đường polyline có ít nhất 2 cạnh. Chi tiết mình trình bày trong file đính kèm luôn.

    Xin cảm ơn! Chúc các bạn ngày nghỉ cuối tuần vui vẻ!http://www.cadviet.com/upfiles/3/64018_tinh_do_doc_giua_2_diem_tren_duong_polyline.dwg


  15. Cảm ơn bạn! Lisp đã chỉnh sửa được theo ý mình rồi.

    hihi rãnh rãnh nhóc nghịch chơi, ko pit có làm hư lsp ko mình test so sánh chưa sữa với sữa cũng đúng cao độ text in ra và thỏa yêu cầu cho properties text có z=0 của bạn, còn số hiển thị trên text vẫn đúng cao độ cần tìm ^^


  16. 1. Đỏ: Bạn tìm dòng này trong Lisp đầu tiên, thay chữ "C" thành chữ "L"

    (MakeText pt3 Caodo3 chieucao 0 "C" "Them_lt")
    
    

    Thành 

    (MakeText pt3 Caodo3 chieucao 0 "L" "Them_lt")
    

    2. Màu xanh mình ko hiểu ý bạn

    Bạn ơi mình muốn sửa cao độ nội suy ra thì text đó có cao độ Z=0. Hiện cao độ nội suy ra có cao độ bằng đúng cao độ mà lisp tính được, ảnh hưởng đến tính khoảng cách từ điểm này đến các điểm khác vì chênh cao độ.


  17.  

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

    Nhấp điểm biết cao độ, chọn text cao độ của điểm đó, nhập độ dốc dạng 0.00... (+ lên - xuống), sau đó nhấp điểm muốn biết độ cao.

     

    (defun c:ddo( / a b txt tt1 sole dd1 vt)
      (defun dxf (id v) (cdr (assoc id (entget v))))
      (setq a (getpoint "\nChon diem da biet cao do: ")
    txt (car (entsel "\nText cao do tuong ung: "))
    tt1 (dxf 1 txt)
    sole (if (setq vt (vl-string-search "." tt1)) (- (strlen (substr tt1 vt)) 2) 0)
    dd1 (getreal (strcat "\nNhap do doc (+ len; - xuong) <" (rtos (if (not dd) (setq dd 0.01) dd)) ">: ")))
      (if dd1 (setq dd dd1))
      (while (setq b (getpoint a "\nChon diem can tinh cao do: "))
        (entmake (list '(0 . "TEXT") (cons 10 b) (cons 11 b) (cons 40 (dxf 40 txt)) (cons 41 (dxf 41 txt))
      (cons 8 (dxf 8 txt)) (cons 62 (if (dxf 62 txt) (dxf 62 txt) 256))
      (cons 7 (dxf 7 txt)) (cons 72 (dxf 72 txt)) (cons 73 (dxf 73 txt)) '(50 . 0) 
      (cons 1 (rtos (+ (atof (dxf 1 txt)) (* dd (distance a b))) 2 sole))))
      )
      (princ)
    )
    

    Mong như mong mẹ về chợ :D

    Em cảm ơn anh! 


  18.  

    Tôi không biết cách nào tạo linetype như vậy, nhưng bạn có thể dùng lsp này để rải cái block đó.

    Điều kiện là trong file phải có cái block tên "VH zig zag" và kích thước của nó theo chiều dài là 1.

    Tôi không biết bạn vẽ theo tỉ lệ nào, cho nên cứ xài thử xem sao.

    Có điều là nó rải theo khoảng cách chẵn, thí dụ nếu kc = 10.5 thì nó chỉ rải 10 thôi.

     

    (defun c:lnt()
      (defun rtd(a) (* 180 (/ a pi)))
      
      (setvar 'insunits 0) 
      (setq a (getpoint))
      (while (setq b (getpoint a))
        (setq n -1)
        (repeat (fix (distance a b))
          (setq n (1+ n))
          (command "-insert" "VH zig zag"
    (if (zerop (rem n 2))
     (polar (polar a (angle a b) n) (+ (angle a b) (* 0.5 pi)) 0.05)
     (polar (polar a (angle a b) n) (- (angle a b) (* 0.5 pi)) 0.05))
    1 1 (rtd (- (angle a b) (* 0.5 pi)))))
        (setq a b)
      ) (princ)
    )
    

    Không dùng được anh ạ. Em muốn rải các nét dọc theo đường polyline, lisp này rải vuông góc với 2 điểm được chọn. Mà gõ lệnh lnt xong cũng không thấy hỏi phải làm gì, hay tại CAD của em bị lỗi? Thôi để em post sang bên Lisp em hỏi cho đúng chuyên ngành.

    Em cảm ơn!

×