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

quansla

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

    672
  • Đã tham gia

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

  • Ngày trúng

    18

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


  1. 13 giờ trước, Phạm văn thành 1994 đã nói:

     

    vâng bác nói giống ý của e đấy ạ 

    Thử code này xem mình không có file để Test, và cũng không biết sau khi có kết quả, thì kết quả này hiển thị dạng nào

    1. Hiện dưới dòng command (dòng lệnh)

    2. Ghi đè vô Text/Mtext/Dim có sẵn

     

     

    lên bạn cứ dùng đi, tiện đâu thì sửa

    (defun c:thunghiem(/ ent l ss str str_dim)
      
      (if (setq ss (ssget '((0 . "*DIM*"))))
        (progn
          (setq L 0.0)
          (foreach dt (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
    	(setq ent (entget dt)
    	      str_dim (if (/= (cdr(assoc 1 ent)) "") (cdr(assoc 1 ent)) (rtos (cdr(assoc 42 ent)) 2 8)))
    	;xu ly string DIm
    	(if (vl-string-search "=" str_dim)
    	  (setq str (substr str_dim (+ 2 (vl-string-search "=" str_dim)) (strlen str_dim)))
    	  (setq str str_dim)
    	  )
    	(if (= str "<>") (setq str (rtos (cdr(assoc 42 ent)) 2 8)))
    	(setq L (+ L (atof str)))	
    	)
          )
        )
      ;Them do chinh xac sau dau phay o day
      (princ (rtos L 2 4))
      ;Neu muon xuat ket qua gi vao Text hay Dim hay Mtext thi de lai dong nay
      (if (setq dt (car(entsel "\nChon Mtext/Text/Dim")))
        (entmod (subst (cons 1 (rtos L 2 4)) (assoc 1 (setq ent (entget dt))) ent))
        )
      (princ)
      )

     


  2. Cảm ơn mọi người đã quan tâm, mình đi xã cả ngày giờ mới online được mới đầu mình cũng đã nghĩ đến việc chắc phải gắn các chiều dài vào Pramateter để đo rồi dùng Lisp để lọc Parameter theo Visiabli, rồi lấy giá trị hiện tại

     

    Cơ mà cách này:

     thủ công; và cách gán Prameter sẽ tương đối khó nếu đối tượng cung tròn (nói chung vẫn tính được, nhưng cần gán công thức chuyên dụng ứng với từng trường hợp); Khá rối loạn khi vào môi trường BE (block editor)

     

     

    * không biết có cách nào khác không nhỉ

     

     

     

    @Duong Nhat Duy Với code của bạn khi tính đường đối tượng đường cong có thể lỗi, có thể thay phần tính chiều dài bằng: 

    (setq len (+ len (vlax-curve-getdistatparam each_obj (vlax-curve-getendparam each_obj))))

     

     

    @Duong Nhat Duy Ví dụ với code Entnext 

    (defun c:zz()
      (if(and (setq ss (ssget '(( 0 . "INSERT"))))
    	  (setq dt (ssname ss 0))
    	  (setq blk (vlax-ename->vla-object dt) i 0))
        (progn
    
          (setq tenblk (if (vlax-property-available-p blk 'effectivename)
    		     (vla-get-effectivename blk)
    		     (vla-get-name blk)
    		     )
    	    )
          (setq dt_bk (cdr (assoc -2 (tblsearch "Block" tenblk))))
          (while (/= "SEQEND" (cdr(assoc 0 (entget dt_bk))))	
    	(princ (strcat "\nDoi tuong trong block thu " (rtos (setq i (1+ i)) 2 0) " la doi tuong: " (cdr(assoc 0 (entget dt_bk)))))
    	(setq dt_bk (entnext dt_bk))
    	)
          )
        )
      (princ)
      )

    @duy782006 có vẻ cách của anh Duy là dùng Gán đối tượng cần lấy chiều dài cho Parameter sau đó dùng thủ thuật lấy giá trị của parameter; Như vậy trùng với cách ban đầu, cách này không tiện khi nhiều đối tượng -> nhiều parameter (thậm chí các parameter này cũng không có gán hành động luôn, chỉ cho vào để về sau get giá trị)

     

     

     

    @Doan Nguyen Van Cách của bác theo em là hay nhất nhưng em chưa hiểu lời giải lắm, có vẻ như là nó tạo ra một tập hợp "ảo" gồm các phần từ đã explore từ Block đầu đúng không, sau đó dùng lệnh lọc qua để tìm chiều dài

     

    Cách làm này tương đương ngoài thực tế làm Cad

    B1/ chọn Block

    B2/ "X" nổ đối tượng

    B3/ Xét riêng tập sau khi nổ xong: duyệt qua từng thằng tính chiều dài thép 

    B4/ Ghi lại giá trị tổng chiều dài, xóa đi toàn bộ tập đã tạo ra sau khi nổ ở B2

    (P/S Linh hồn của Code này có lẽ là ở đoạn này: (vlax-invoke (vlax-ename->vla-object ent) 'explode)             )

     

    Cảm ơn bác, mong bác giải thích kỹ hơn nếu không đúng


  3. Chào cả nhà, mình đang thử làm một block động thép và một Block ATTDEF với mục đích rải thép

     

    Trong hình là hình ảnh của 2 đối tượng nêu trên

     

    Mọi người cho hỏi mình cần dùng Code gì để có thể

     Lấy được chiều dài của tổng đối tượng có Layer "Thep doc" (màu đỏ trong hình) khi mà đối tượng này thuộc loại bị điều khiển bởi thuộc tính của block dynamic

     

     

    Xin cảm ơn mọi người

     

     

    3333.png

    Rai thep.dwg


  4. cho 1 like cho @alisp

    Cười 

     

     

    Với chủ thớt:

    1. Không cần thiết phải thêm lựa chọn layer làm gì, dùng lệnh Layiso (chú ý thiết lập Fezzen gì đấy) hoặc đơn giản dùng Qslect hoặc khó hơn ý dùng Fiel là được phần quét chọn toàn bộ đối tượng thuộc layer

     

    2. Bạn có chắc muốn ẩn layer của đối tượng dài 20 đơn vị sau khi kết thúc lệnh (thử nghĩ xem nếu chạy Lisp xong mà màn hình không có hiển thị gì thay đổi thì làm sao?)

     

    3. Muốn ẩn đối tượng có thể sử dụng Layoff rất đơn giản

     

    4. Có chút nhầm lẫn rất rất không lên sử dụng với Spline, mà bạn làm cái gì mà có yêu cầu này vậy, bản vẽ để test có thể gửi lên không

     

    Lisp viết lại thêm yêu cầu đổi tên layer và để màu đối tượng là màu 1 (red)

    (defun c:t11111(/ ob p1_diemdau p2_diem_t2 p3_diem_t3 p4_diemcuoi)
      ;theo yeu cau cua cadvieter tai https://www.cadviet.com/forum/topic/179486-xin-lisp-c%E1%BA%AFt-%C4%91o%E1%BA%A1n-th%E1%BA%B3ng-theo-y%C3%AAu-c%E1%BA%A7u/
      ; yeu cau B1-quet chon cac doi tuong la LINE, thuoc Layer ?
      ; List tu chon 4 diem tren Line da chon de tao lai thanh doi tuong moi (da cat)
    
      ;B1: quet chon doi tuong
      (foreach dt (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((-4 . "<OR")								      
    								      (-4 . "<AND") (0 . "LWPOLYLINE") (90 . 2) (-4 . "AND>")
    								      (0 . "LINE")
    								      ;(0 . "SPLINE")
    								   (-4 . "OR>")
    								   ))
    							  )))
        ;(setq dt (car(entsel)))
        (setq ob (vlax-ename->vla-object dt)
    	  p1_diemdau (vlax-curve-getpointatdist ob 5)
    	  p2_diem_t2 (vlax-curve-getpointatdist ob 25)
    
    	  p3_diem_t3 (vlax-curve-getpointatdist ob (- (vlax-curve-getDistAtParam ob (vlax-curve-getEndParam ob)) 25))
    	  p4_diemcuoi (vlax-curve-getpointatdist ob (- (vlax-curve-getDistAtParam ob (vlax-curve-getEndParam ob)) 5))
    	  )
    
    
        ;(if (= (cdr(assoc 0 (entget dt))) "SPLINE")
          ;(setq p3_diem_t3 (polar p4_diemcuoi (angle p3_diem_t3 p4_diemcuoi ) 20)))
        (if (and p1_diemdau p2_diem_t2)
          (entmakex
    	(list (cons 0 "LINE") (cons 8 (strcat (cdr(assoc 8 (entget dt))) "-1")) (cons 10 p1_diemdau) (cons 11 p2_diem_t2) (cons 62 1)))
          )
        (if (and p3_diem_t3 p4_diemcuoi)
          (entmakex
    	(list (cons 0 "LINE") (cons 8 (strcat (cdr(assoc 8 (entget dt))) "-1")) (cons 10 p3_diem_t3) (cons 11 p4_diemcuoi) (cons 62 1)))
          )
    
    
        ;Neu muon xoa thi de lai dong nay
        ;(entdel dt)
        ;Muon xoa thi sua dong nay
        
        )
      
      (princ)
      )

     


  5. Thiếu giữ liệu, thiếu file cad minh họa, không hiểu 20mm là gì (cad không sử dụng đơn vị đo lường chiều dài nhé) cad chỉ có đơn vị Cad thôi. Có chắc là muốn xóa đi không? xóa đi lấy gì để kiểm tra, Layer và màu sắc đối tượng sau khi hiệu chỉnh là gì, có cần xử lý với Spline + Polyline không?

     

     

    Bạn cần kiểm tra lại cách đăng bài trong Forum nhé (đọc nội quy lại nhé)

    (defun c:t11111(/ ob p1_diemdau p2_diem_t2 p3_diem_t3 p4_diemcuoi)
      ;theo yeu cau cua cadvieter tai https://www.cadviet.com/forum/topic/179486-xin-lisp-c%E1%BA%AFt-%C4%91o%E1%BA%A1n-th%E1%BA%B3ng-theo-y%C3%AAu-c%E1%BA%A7u/
      ; yeu cau B1-quet chon cac doi tuong la LINE, thuoc Layer ?
      ; List tu chon 4 diem tren Line da chon de tao lai thanh doi tuong moi (da cat)
    
      ;B1: quet chon doi tuong
      (foreach dt (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((-4 . "<OR")								      
    								      (-4 . "<AND") (0 . "LWPOLYLINE") (90 . 2) (-4 . "AND>")
    								      (0 . "LINE")
    								   (-4 . "OR>")
    								   ))
    							  )))
        ;(setq dt (car(entsel)))
        (setq ob (vlax-ename->vla-object dt)
    	  p1_diemdau (vlax-curve-getpointatdist ob 5)
    	  p2_diem_t2 (vlax-curve-getpointatdist ob 25)
    
    	  p3_diem_t3 (vlax-curve-getpointatdist ob (- (vlax-curve-getDistAtParam ob (vlax-curve-getEndParam ob)) 25))
    	  p4_diemcuoi (vlax-curve-getpointatdist ob (- (vlax-curve-getDistAtParam ob (vlax-curve-getEndParam ob)) 5))
    	  )
        (if (and p1_diemdau p2_diem_t2)
          (entmakex
    	(list (cons 0 "LINE") (cons 8 "Net moi") (cons 10 p1_diemdau) (cons 11 p2_diem_t2) (cons 62 1)))
          )
        (if (and p3_diem_t3 p4_diemcuoi)
          (entmakex
    	(list (cons 0 "LINE") (cons 8 "Net moi") (cons 10 p3_diem_t3) (cons 11 p4_diemcuoi) (cons 62 1)))
          )
    
    
        ;Neu muon xoa thi de lai dong nay
        ;(entdel dt)
        ;Muon xoa thi sua dong nay
        
        )
      
      (princ)
      )

     

    • Like 1

  6. Đến đây trong cùng thư mục chứa file cad bạn đang mở có một loạt file "SLD" đã được tạo

     

     

    Bây giờ nhiệm vụ là tạo 01 file SLB duy nhất bao chọn toàn bộ lũ "SLD" trên

     

     

    Quá đơn giản, vẫn trong Lisp cung cấp gõ lệnh trên cad "SLB" / chọn mới tên file ví dụ "FILE TONG HOP" chưa đầy  1s sau trong Folder chứa file cad đang mở, xuất hiện file SLB mà bạn muốn,

    giờ chỉ việc xóa toàn bộ file SLD ở trên đi -> XONG

     

     

     

    Đã trình bày ở trên rồi mà bạn đã làm theo tôi nói chưa

     

    P/S sao lại là file không định dạng, bạn đã mở hiển thị phần đuôi file chưa (setup của Win) hãy thử gửi hình ảnh sau khi dùng lệnh (2 ảnh: command Cad và hình ảnh Folder chứa file cad) hoặc làm video quay thao tác màn hình


  7. Mình không hiểu vì sao thớt không làm được

     

    các bước thự hiện như sau:

    B1. Mở file cad có chứa các hình vẽ, đối tượng cần tạo SLD, SLB file (ghi nhớ vị trí lưu của file cad này, vì theo lisp mình đã gửi ở link trên (Tao file SLD, SLB) thì mặc định file tạo ra sẽ ở cùng thư mục file cad đang hoạt động (nếu file cad chưa lưu: tạo ở thư mục My doccuments tương ứng trên máy tính người dùng)

     

    B2. Zoom + pan + xóa, ẩn, move, delete làm bất cứ gì bạn muốn để màn hình hiển thị của Cad hiện phần đối tượng CAD mà bạn muốn "nhìn" thấy trong file SLD (tức nếu dùng trong hộp thoại thì khi gọi ảnh "*.SLD" lên thì ảnh sẽ hiển thị là phần Screen = màn hình CAD mà bạn hiển thị lúc này"

     

    B3. Gõ lệnh SLD (như trong lisp đã gửi) / nhập tiếp tên file để lưu file SLD này-> chưa đầy 1s, trong folder chứa file cad bạn đang mở sẽ được Create (tạo mới) một file SLD mà tên do bạn nhập 

     

    B4,5,6,....n làm liên tiếp Zoom Pan, xóa, ẩn, move, delete ,... giống hệt như B3 nếu bạn muốn nhiều file "SLD" hơn nữa

     

     

     

    Đến đây trong cùng thư mục chứa file cad bạn đang mở có một loạt file "SLD" đã được tạo

     

     

    Bây giờ nhiệm vụ là tạo 01 file SLB duy nhất bao chọn toàn bộ lũ "SLD" trên

     

     

    Quá đơn giản, vẫn trong Lisp cung cấp gõ lệnh trên cad "SLB" / chọn mới tên file ví dụ "FILE TONG HOP" chưa đầy  1s sau trong Folder chứa file cad đang mở, xuất hiện file SLB mà bạn muốn,

    giờ chỉ việc xóa toàn bộ file SLD ở trên đi -> XONG

     

     

    Có gì bạn không làm được


  8. Bác Hà hình như lộn rồi chủ thớt muốn là lọc kết quả tìm đc của các text dim đã chọn, phần sau dấu = và cộng với nhau cơ

     

     

    Bạn biết Lisp vậy khá đơn giản thuật toán thôi mà tìm vị trí dấu = trong string và lấy toàn bộ phần sau nó chuyển qua dạng số và cộng


  9. Lười và ăn sẵn quá

    (vl-load-com)
    (defun c:phundiem(/ f fn l p r vText2 LM:str->lst)
    
    (defun LM:str->lst ( str del / len lst pos )
        (setq len (1+ (strlen del)))
        (while (setq pos (vl-string-search del str))
            (setq lst (cons (substr str 1 pos) lst)
                  str (substr str (+ pos len))
            )
        )
        (reverse (cons str lst))
    )
      (defun vText2(str p layer k mau) 
        (entmakex
          (list
    	'(0 . "TEXT")
    	'(100 . "AcDbEntity")
    	'(100 . "AcDbText")
    	(cons 1 str);string
    	(cons 7 (getvar "textstyle"));style
    	(cons 8 layer);layer
    	(cons 62 mau);color
    	(cons 10 p);insertion point
    	(cons 11 p);alignment point
    	(cons 40 k);text height - change by suit
    	(cons 41 1.0);text width
    	(cons 50 0.0);1.5708 - vertical, 0.0 - horizontal
    	(cons 51 0.0);oblique angle
    	'(71 . 0);alignment
    	'(72 . 0);alignment
    	'(73 . 0);alignment
    	)
          )
        ;(princ)
        )
      
      ;(setq f (getfiled "\nChon file " "" "txt" 2))
      (setq f "C:\\Users\\Admin\\Desktop\\33.txt")
      (setq fn (open f "r"))
      (while (setq l (read-line fn))
        (setq r (vl-remove-if '(lambda(x) (= x "")) (LM:str->lst l " "))
    	  p (mapcar 'atof (list (nth 2 r) (nth 3 r) (nth 4 r))))
    
        (vText2 (car r) p "ten_diem" 0.5 1)
        (vText2 (cadr r) p "Ghi_chu" 0.25 3)
        (entmakex
          (list
    	'( 0  . "POINT")
    	(cons 10 p)
    	(cons 62 4)
    	(cons 8 "Point")))
        )
      (close fn)
      (princ)
      )

    Nên thu phí đi thôi


  10. Oa hôm nay xem tin nhắn bạn nhắn riêng mới để ý lại, đúng rồi lisp không thể hoạt động được mình quên mất DXF70 của Dim

     

    (defun c:tinh_tong_dim( / ent S dt lst_loc)
        (vl-load-com)
        (defun tinh_bit(N / kq r)
        (setq r '() kq 0)
        (while (and (/= N 0)
    		(/= 0 (setq kq (fix (/ (log N ) (log 2 ))))))
          (setq r (append r (list kq))
    	    N (rem N (expt 2 kq)))
          )
        (if (= N 0)
          (setq r r)
          (setq r (append r (list 0))))
        (mapcar '(lambda (x) (expt 2 x)) r)
        )
    
    
    
    
    
      
      (setq S 0)
    
      ;Muon bo loai gi thi de ten no vao day
      (setq lst_loc '(4 3 2))
      ;Vi du o day la bo 4=ban kinh    3 = duong kinh   2=doc goc
      
    ;;;0 = Rotated, horizontal, or vertical
    ;;;1 = Aligned Dim Align
    ;;;2 = Angular Dim Goc
    ;;;3 = Diameter Dim duong kinh
    ;;;4 = Radius   Dim ban kinh
    ;;;5 = Angular 3-point Dim Cung tron ???
    ;;;6 = Ordinate Thuong ????
    
      
      (foreach dt (acet-ss-to-list (ssget '(( 0 . "*DIM*"))))
        (setq ent (entget dt))
        (if (not (member (apply '+ (vl-remove-if '(lambda (x) (member x '(32 64 128))) (tinh_bit (cdr (assoc 70 ent))))) lst_loc))
          (setq S (+ S (if (/= "" (cdr (assoc 1 ent))) (atof(cdr (assoc 1 ent))) (cdr (assoc 42 ent))))))
        )
      (princ (rtos S 2 4))
      (alert (strcat "L=" (rtos S 2 4)))
      (if (setq ss (ssget ":S" '((0 . "*TEXT"))))
        (progn
          (setq ent (entget (ssname ss 0))
    	    txt (cdr(assoc 1 ent)))
          (if (setq pos (vl-string-search "=" txt))
    	(setq txt (strcat (substr txt 1 (1+ pos)) (rtos S 2 4)))
    	(setq txt (strcat "L=" (rtos S 2 4))))
        (entmod (subst (cons 1 txt) (assoc 1 ent) ent)))
        )
      (princ)
      )

    Trong đoạn lisp trên mình đã để đoạn để bạn có thể sửa

    (setq lst_loc '(4 3 2 5))

     

     

    Tương ứng các số mình đã gi trong lisp, nếu bạn để số nào thì Dim tương ứng với số đó sẽ không được tính tổng

     

    P/S phần tính Dim trừ khá dễ nhưng mình chưa ưng code trên lắm; Làm phiền mọi người trên diễn đàn góp ý giúp về Code được không ạ, cứ thấy có gì đó chưa ổn và cách để chọn đối tượng ban đầu nữa, giá mà nó lọc ngay từ lúc quét chọn thì tốt, ai có cách nào hay không ạ, Xin cảm ơn

     

     

    Ghi chú cách sử dụng LISP

    B1. Gõ lệnh Tinh_tong_dim

    B2. Quét chọn tất cả các dim cần tính (LISP sẽ tự động loại bỏ không tính số liệu của "Bán kính" "đường kính" và "đo góc"

    B3. LISP sẽ hiện kết quả dạng hộp thoại 

    B4. Chọn Text/Mtext cần thay kết quả

    Kết thúc lisp

    • Vote tăng 1

  11. Mình về rồi, máy này không có Cad, mình quên mất

    bạn download lại nhé

    Chắc do chưa khởi tạo giá trị ban đầu của biến delta

    (defun c:ve_vai_dia (/ chieu_day_net_ve ent list_point n p1 p2)
      (setq chieu_day_net_ve 0.15)
    (vl-load-com)
    (or delta (setq delta 2.0))
      (or (setq delta (getdist (strcat "\nChon chieu dai doan gap<" (rtos delta 2 2)">"))) (setq delta 2.0))
      
      (foreach dt (acet-ss-to-list (ssget '((0 . "*LINE")(8 . "VolUnsoil"))))
        (setq ent (entget dt)
    	  list_point (vl-remove-if-not '(lambda (x) (= (car x) 10)) ent)
    	  N (length list_point))
        (if (< (cadr (car list_point)) (cadr (last list_point)))
          (setq p1 (cons 10 (polar (cdr(car  list_point)) 0.0 delta))
    	    p2 (cons 10 (polar (cdr(last list_point)) pi  delta))
    	    list_point (append (list p1) list_point (list p2)))
    
          (setq p1 (cons 10 (polar (cdr(car  list_point)) pi delta))
    	    p2 (cons 10 (polar (cdr(last list_point)) 0.0  delta))
    	    list_point (append (list p1) list_point (list p2)))
    
          )
        (entmakex
          (append (list
    		'(0 . "LWPOLYLINE")
    		'(100 . "AcDbEntity")
    		(cons 8 "VAI DKT2")
    		(cons 6 "bylayer")
    		(cons 48 1)
    		(cons 62 256)
    
    ;Do rong LWPoly
    		(cons 43 chieu_day_net_ve)
    
    		'(100 . "AcDbPolyline")
    		(cons 90 (length list_point))
    		(cons 70 0)
    	      )
    	      (apply 'append
    		     (mapcar '(lambda (x)
    				(append	(list x)
    					(list (cons 40  chieu_day_net_ve) (cons 41  chieu_day_net_ve))
    				)
    			      )
    			     list_point
    		     )
    	      )
          )
        ))
      )

     


  12. Nói bán kính thì mình chỉ xử lý bán kính nhé ^T^ 

    ;; free lisp from cadviet.com
    ;;; this lisp was downloaded from https://www.cadviet.com/forum/topic/205-vi%E1%BA%BFt-lisp-theo-y%C3%AAu-c%E1%BA%A7u/?page=84&tab=comments#comment-62720
    (defun c:TTD(/ ss n i S duyet ent sst nt j St duyett entt Skq)
    (prompt "\n Chon cac Dim cong:")
    (setq ss (ssget '((0 . "DIMENSION")
    		  (-4 . "<not")
    		  (100 . "AcDbDimension")
    		  (-4 . "not>")
    		  )))
    
    (setq n (sslength ss) i 0 S 0 duyet 0)
    
    (while (< i n)
    (setq ent (entget(ssname ss i)))
    
    (if (= (cdr(assoc 1 ent)) "")
    (setq duyet (cdr(assoc 42 ent)))
    (setq duyet (atof(cdr(assoc 1 ent))))
    )
    (setq S (+ S duyet))
    (setq i (1+ i))
    )
    
    
    (alert (rtos S 2 0))
    
    (princ)
    )
    (defun c:Trudim(/ ss n i S duyet ent sst nt j St duyett entt Skq)
    (prompt "\n Chon cac Dim lam so bi tru :")
    (setq ss (ssget '((0 . "DIMENSION"))))
    
    (prompt "\n Chon cac Dim lam so tru :")
    (setq ss (ssget '((0 . "DIMENSION")
    		  (-4 . "<not")
    		  (100 . "AcDbDimension")
    		  (-4 . "not>")
    		  )))
    
    (setq n (sslength ss) i 0 S 0 duyet 0)
    (setq nt (sslength sst) j 0 St 0 duyett 0)
    
    (while (< i n)
    (setq ent (entget(ssname ss i)))
    
    (if (= (cdr(assoc 1 ent)) "")
    (setq duyet (cdr(assoc 42 ent)))
    (setq duyet (atof(cdr(assoc 1 ent))))
    )
    (setq S (+ S duyet))
    (setq i (1+ i))
    )
    
    (while (< j nt)
    (setq entt (entget(ssname sst j)))
    
    (if (= (cdr(assoc 1 entt)) "")
    (setq duyett (cdr(assoc 42 entt)))
    (setq duyett (atof(cdr(assoc 1 entt))))
    )
    (setq St (+ St duyett))
    (setq j (1+ j))
    )
    
    (setq Skq (- S St))
    
    (alert (rtos Skq 2 0))
    
    (princ)
    )

     

    • Like 1

  13. Quick code nhé

     

    cơ mà vẫn không biết chiều cao của chủ topic dùng để làm gì, tự kiểm tra nhé

     

    (defun c:ve_vai_dia (/ chieu_day_net_ve ent list_point n p1 p2)
      (setq chieu_day_net_ve 0.15)
      (or (setq delta (getdist (strcat "\nChon chieu dai doan gap<" (rtos delta 2 2)">"))) (setq delta 2.0))
      
      (foreach dt (acet-ss-to-list (ssget '((0 . "*LINE")(8 . "VolUnsoil"))))
        (setq ent (entget dt)
    	  list_point (vl-remove-if-not '(lambda (x) (= (car x) 10)) ent)
    	  N (length list_point))
        (if (< (cadr (car list_point)) (cadr (last list_point)))
          (setq p1 (cons 10 (polar (cdr(car  list_point)) 0.0 delta))
    	    p2 (cons 10 (polar (cdr(last list_point)) pi  delta))
    	    list_point (append (list p1) list_point (list p2)))
    
          (setq p1 (cons 10 (polar (cdr(car  list_point)) pi delta))
    	    p2 (cons 10 (polar (cdr(last list_point)) 0.0  delta))
    	    list_point (append (list p1) list_point (list p2)))
    
          )
        (entmakex
          (append (list
    		'(0 . "LWPOLYLINE")
    		'(100 . "AcDbEntity")
    		(cons 8 "VAI DKT2")
    		(cons 6 "bylayer")
    		(cons 48 1)
    		(cons 62 256)
    
    		;Do rong LWPoly
    		(cons 43 chieu_day_net_ve)
    
    		'(100 . "AcDbPolyline")
    		(cons 90 (length list_point))
    		(cons 70 0)
    	      )
    	      (apply 'append
    		     (mapcar '(lambda (x)
    				(append	(list x)
    					(list (cons 40  chieu_day_net_ve) (cons 41  chieu_day_net_ve))
    				)
    			      )
    			     list_point
    		     )
    	      )
          )
        ))
      )

     


  14. Công việc của bro là gì thế, đổi layer để tính toán riêng lẻ, hay trích dẫn à

     

    ý của anh Duy là

    1. Lisp có thể lọc được 1 tập đối tượng do người dùng chọn, sau đó set (cài đặt) cho mỗi đỗi tượng thuộc 1 layer khác nhau, tên layer từ 1-255, kể cả thiết lập màu cũng được

     

    Nhưng:

    1. Nếu tập đối tượng chọn >255 thì set màu gì tiếp theo

    2. Thứ tự set layer như thế nào, ví dụ cái ở trên thì có layer nhỏ, cái bên trái hơn thì có layer nhỏ hơn; hay kể cả set từ 1-100; set từ 44-133;..... quá nhiều chưa rõ

     

    cần gửi file nên nhé, 


  15. Trước có viết một cái LISP về thống kê thép này rồi, sau đi bê vữa rồi, không phải vẽ nữa lên không phát triển nữa

     

    Giới thiệu bạn xem:

     

    Video 1 - LISP giai đoạn đầu - chỉ thống kê cho 1 cấu kiện (không có cột số cấu kiện) và chỉ tính đến chiều dài, chứ không tính đến khối lượng thép

     

    - Công dụng

    1. Thống kê nhiều loại thép

    2. Có mẫu thép "trắng" để người dùng có thể vẽ vời hình dạng bất kỳ nếu lisp chưa có

    3. bạn nào biết về Cad + Lisp, có thể modify mở rộng mẫu hình dạng thép

    4. cho phép tính chiều dài mối nối 30d, 40d, gì gì đấy D được tuốt

    5. Cho phép làm tròn mối nối sau khi tính 30d, ví dụ 30D (với D=18) thì 30x18= 540 _> có thể lựa chọn dùng chính xác 540 hay bội của 50 ->550; hay bội của 100 là 600

    6. Hỗ trợ viết công thức toán học trong hộp thoại

    7. Hỗ trợ Đo khoảng cách khi đang dở thống kê

    8. Hỗ trợ đổi mẫu thép nhanh khi không sử dụng mẫu cũ (vẫn giữ lại các thông số chung nếu trùng)

    9. Hỗ trợ gì đó, quên hết rồi, bạn xem video thêm nhé

     

     

     

    video 2- chưa làm; mình có cải tiến LISP để thêm vào cột Số cấu kiện ; và Tổng chiều dài (m); Tổng Khối lượng thép (T)

     

     

     


  16. Nếu để thi công thì cần phải xét từng khoảng, bố trí thép trong mỗi khoảng đó (thường là các ô sàn khác nhau): khi đó đương nhiên cần tính toán, khoảng hở thép hai phía, khoảng cách thép tương ứng,... và số thép phải tính riêng từng khoảng rồi cộng với nhau

    Nếu để kiểm tra, thiết kế thì có thể lấy dư hẳn ra, như là lấy Tổng thông thủy các ô sàn/ khoảng cách, lấy dư lên

     

    Mà 2 nữa: vấn đề bạn đang làm là làm thi công hay thiết kế

     

    Nếu thi công, thì: phải nhìn trên bản vẽ, thẩm tra sơ bộ ở nhà trước khi đến công trường tính chính xác bản vẽ, hiểu bản vẽ -> đến thì chỉ cắt thôi, số lượng thì lấy ít hơn thống kê một ít, hoặc ít hơn tính toán bằng cách chi thông thủy một ít, khi bố trí để còn dư lại

     

     

    Nếu là thiết kế, thì theo mình Nếu yêu cầu kiểm tra kỹ từng khoảng cách đai, số lượng đai trong dầm; hay trong ví dụ này là khoảng cách và số lượng thép sàn rải, nếu cần cả chiều dài thanh thép và hình dáng thép thì bạn phải vẽ vời hết ra, kiểm tra từng đoạn cơ; và cần bố trí DIm hợp lý để có thể IN RA KHI XUẤT HỒ SƠ vậy thì nó tương tự của mình chứ nhỉ

     

     

    Lisp Không chạy, bạn thêm dòng (vl-load-com) và dòng đầu tiên, hoặc cuối cùng của Lisp tải về nhé, thử lại xem


  17. Đọc không hiểu gì cả, đoán này là làm thế này, còn bước tính tổng, bạn làm thủ công nốt nhé

     

     

    (defun c:1111thunghiem()
      (vl-load-com)
      (if (setq ss (ssget '(( 0 . "*DIM*"))))
        (progn
          (while(not (and
               (setq phi (getstring "\nChon duong kinh thanh thep "))
               (member (atoi phi) '(6 8 10 12 14 16 18 20 22 25 28 32 35 38 40 42 45))           
               ))
        (princ "\nDuong kinh thep phai la 6 8 10 12 14 16 18 20 22 25 28 30 32 35 38 40")
        )
          (while(not (and
               (setq khoang (getstring "\nChon Khoang cach can chia "))
               (not (equal 0.0 (atof khoang) 0.01))
               ))    
        )
          
          (princ (strcat "\Duong kinh thep D" phi "a" khoang))
          (setq ss (vl-remove-if'listp (mapcar 'cadr(ssnamex ss))))
          (foreach dt ss
        ;chay qua tat ca cac doi tuong de chuyen doi text
        (setq ent (entget dt))
        (entmod (subst (cons 1 (strcat (rtos (1+ (fix(/ (cdr(assoc 42 ent)) (atof khoang)))) 2 0) "D" phi "a" khoang "\\XL=<>")) (assoc 1 ent) ent))
        )
          )
        )
      (princ)
      )

     


  18. Trước kia hồi mới ra trường, mình luôn quan niệm là: là kỹ thuật, là sinh viên tiếp cận cái mới nhất, học cái mới nhất, quản lý khoa học nhất, kết quả là mình tự gò ép mình

    1. Layer phải là layer theo hệ thống có đặt nét, có đặt màu chính xác, không phụ thuộc vào người khác

    2. Dim style, Text Style cái nào ra cái đấy, tên phải rõ ràng, ví dụ Dim tỷ lệ 1-100 riêng, 1-20, 1-25,... text thì phải là Text tiêu đề, text ghi chú, text leader, text bản vẽ to loại 1, loại 2, text khung tên ở tên bản vẽ, text khung tên ở tên công ty, tên người vẽ, người kiểm tra

    3. và còn nhiều nhiều lắm, hồi đấy phải nói là, tuổi trẻ, tài lanh, (dễ sinh lắm người ghét đấy- may mắn mình chưa bị ai ghét ha....)

     

     

    Sau đó trong quá trình làm mình nhận thấy

    1. Để có thể khoa học trong quản lý layer mình làm tốt nhưng nhóm thì sao, công ty thế nào, liệu có thể thay đổi suy nghĩ toàn bộ mọi người không, chung quy đều hướng đến: hiệu quả, năng suất, và cuối cùng vẫn là kiếm tiền

    2. Trong quá trình làm việc, việc tận dụng sản phẩm người khác là không thể tránh khỏi, phải chấp nhận file bãn vẽ nặng hơn, nhiều đối tượng phải quản lý hơn, .... và còn ty tỷ cái khác nữa cơ, nhiều lúc gét cách làm của người khác lắm, nhưng sửa lại thì rất mất thời gian, mà sếp lại giục ha

    3. Trong khi làm việc, va vấp sinh kinh nghiệm, khó khăn sinh động lực, có động lực tất có phương pháp giải quyết có thể chưa chu toàn nhưng phần nào đáp ứng, hơn nữa theo mình đến giờ các đối tượng trong bản vẽ không phải Create (kiến tạo, vẽ mới) là nhiều ; là phần lớn là Modify (sửa đổi, thay đổi cái cũ) chiếm nhiều hơn; điều đó dẫn đến lệnh hiệu chỉnh dùng nhiều, Ma (match prop) dùng nhiều, Copy - move - eddit (đối với text) lại càng nhiều

     

     

    ok rồi đấy vậy là mình làm theo cách sau:

     

     

     

    1. Mình không phải là người làm ra được toàn bộ sản phẩm, là đúc kết nhiều người, là nhiều bản vẽ, nhiều phần phối hợp

    2. Cần chung hòa các nguyên tắc để khi in ra "Tương đối" trình bày đẹp bản vẽ (chú ý là tương đối nha)

     

     

    Kết luận cách làm của mình như sau
    Toàn bộ các đối tượng Text, Dim, Hatch mà mình coi là chuẩn ở tỷ lệ cố định (thường là 1:100) in trên khổ cố định (thường là A3) được coi là đẹp, được lấy làm mẫu + Khung tên cố định (đóng Block) chuẩn   được lưu vào riêng một chỗ trong bản vẽ

     

     

     

    Mỗi khi cần sử dụng ở tỷ lệ khác ví dụ 1/20; 1/25; 1/50; 1/250;...... thì Scale riêng toàn  bộ cái ở trên theo tỷ lệ tương ứng, sau đó, khi cần cái nào thì Copy ra, Mathchprop theo vậy là có thể khỏi lo về đồng bộ: Text, Hatch, Linetype, LineScale, hay thậm chí LineWeight, Transpote (trong suốt)

     

    Thế còn Dim, giải quyết sao?

     

    Mình làm thế này

     

    CHỈ DÙNG MỘT KIỂU DIM DUY NHẤT - DUY NHẤT NHA

     

    Trong thiết lập Dim phải dùng TextStyle là kiểu có Size là 0 (không thiết lập chiều cao Dim) và toàn bộ thiết lập khác về cỡ mũi tên, chiều dài, khoảng cách ,....KHÔNG SỬ DỤNG ANNOTATIVE (tỷ lệ động, không cần quan tâm đâu, thường là mọi người toàn làm thế thôi)

     

     

    Sau đó khi dùng đến Dim ở tỷ lệ khác quá đơn giản: đặt lại hai biến (đương nhiên mình đã đổi lệnh để gọi hai biến này)

    Biến DimLfac và biến DimScale

     

     

    Ví dụ nha

    1. Dim chuẩn 1-100

     

    2. cứ vẽ phần cần thể hiện 1-100 cho bản vẽ A3- in tỷ lệ 1-100 đi

     

     

    3. Khi cần vẽ in A3, tỉ lệ 1-50, làm như sau

          3.1 Scale toàn bộ cái khung cố định (đã nói ở trên)  lên lớn hơn 2 lần + đổi biến DimLfac giữ nguyên là 1; đối biến DimScale thành 50 

          3.2 Vẽ chiều dài thực (hông phải Scale làm gì) trong khung tên copy ở 3.1 ra; lấy Text cần trình bày Copy ở 3.1 ra rồi Modyfi; Lấy Hatch copy ở 3.1 ra để MatchProp cho Hatch mới cần trình bày  -> ngon  khi in bản vẽ A3, chắc chắn TExt, tỷ lệ Hatch, tỷ lệ LineWeight, LineType giống hệt nhau

     

        3.3 Cần đo Dim ở tỷ lệ 1/50 hả cứ đo thôi, bằng cách đổi biến ở trên, cứ dùng 1-100 đi, nhưng đảm bảo, kích thước đo được (giữ nguyên như khi vẽ và là chiều dài thực) còn tỷ lệ to nhỏ của Dim (do đã đặt Dimscale là 50 - tức là nhỏ hơn 2 lần so với Dimscale nguyên bản của 1-100 là 100 - tất nhiên rồi) vậy thì mọi thứ như chiều cao, khoảng cách, khoảng kéo dài, ... cũng sẽ nhỏ hơn 2 lần so với Dim 1/100 - Đạt tiêu chí đề ra

     

     

    333.dwg

    Xem bản vẽ minh họa nhé

     

     

     


  19. Không phải lỗi đâu. Cuối tuần mình về nhà rồi ko có máy để check

     

     

    ban có biết chút về lisp ko

     

    vaans đề của bạn đơn giản là nội dung của Dim được Format định dạng để có hiển thị theo ý người dùng, cách format đấy làm cho text của Dim xuất hiện thêm ký tự lạ

     

     

    nhwng khi xuất ra các định dạng đấy lại thành thừa thãi và gây lỗi trên 

     

     

    nếu biết lisp bạn dùng khoá remove format text list cad. Của Lee-mac. Và sửa thêm

     

     

    neeus ko biết bạn dùng chức năng subtital của exel hoặc find and replace cũng được

     

     

    ko thì đưa file càd bạn test nên nhờ mn giúp đỡ xem

    • Like 1
    • Vote tăng 1
×