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. Đây nhá:

     

    (defun C:HA2 (/ fn fw i lst txt)
      ;Doan Van Ha Cadviet.com
      (princ "\nChon cac Text/Mtext/Dimension can xuat ra file..."
      )
      (setq	lst (acet-ss-to-list (ssget '((0 . "*TEXT,DIMENSION"))))
    	fn  (getfiled "Chon file de save" "" "txt" 1)
    	fw  (open fn "w")
      )
      (setq i 0)
      ; (setq n (nth 0 lst))
      (foreach n lst
        (cond
          ((= (cdr (assoc 0 (entget n))) "TEXT")
           (setq txt (cdr (assoc 1 (entget n))))
          )
          ((= (cdr (assoc 0 (entget n))) "MTEXT")
           (setq txt (cdr (assoc 1 (entget n))))
          )
          ((= (cdr (assoc 0 (entget n))) "DIMENSION")
           (if (= (cdr (assoc 1 (entget n))) "")
    	 (setq txt (rtos (cdr (assoc 42 (entget n)))))
    	 (setq txt (cdr (assoc 1 (entget n))))
           )
          )
        )
        (if (/= (rem (setq i (1+ i)) 4) 0)
          (princ (strcat txt ",\t") fw)
          (princ (strcat txt ",\n") fw))
      )
      (close fw)
    )

     

    • Like 1

  2. Theo mình không nên viết lisp làm gì, tự kiểm bằng thủ công thì hơn, cho dù bạn có dùng Block từ đầu thì bạn vẫn có thể mắc lỗi, một vị trí chèn 2 block (tuy có thể khắc phục bằng lệnh Overkill) hoặc lỗi trong phạm vi quét vùng chọn có Block nhưng không đúng ý thiết kế (sai sót do copy, move gì đấy)

     

    Hơn nữa bao giờ cũng phải kiểm lại bản vẽ mà, xem sự đúng quy phạm, hợp lý, thuận tiện khi sử dụng, thi công hay không nữa

     

     

    Sau này trở đi, dùng Block thôi, còn các bản vẽ hiện tại, chấp nhận, hoặc vẽ lại, hoặc để đấy đếm tay thôi, chỉ khắc phục từ bây giờ chở đi thôi

    • Like 1

  3. Đây nhé bạn, lâu quá không vào diễn đàn, không biết để code vào khung nữa rồi, hix

     

     

    • (defun loc_rieng_so_dautien(str / i l n vl-str)
        (setq i 0 vl-str (vl-string->list str) N (length vl-str) l '())
        (while (<= i (strlen str))
          (if (and(<= 48 (nth i vl-str)) (<= (nth i vl-str) 57))         
            (setq l (append l (list (nth i vl-str))) )
            (if (= (length l) 0)
          (setq i (1+ i))
          (setq i (strlen str)))
          )
          (setq i (1+ i))
          )
        (vl-list->string l)
        )


      (defun c:test  (/ n ss tex value)
        
        (if (setq ss (ssget (list '(0 . "TEXT")
                    (cons 1 "*/*"))))
          (progn
            (setq n 0)
            (repeat (sslength ss)
              (setq value (cdr (assoc 1 (entget (ssname ss n)))))
              (if (AND(/= (setq tex (loc_rieng_so_dautien  value)) nil)
              (> (strlen tex) 0))
                (entmake
                  (list
                    (cons 0 "TEXT")
                    (cons 100 "AcDbText")
                    (cons 10 (trans (cdr (assoc 10 (entget (ssname ss n)))) 1 0))
                    (cons 40 (cdr (assoc 40 (entget (ssname ss n)))))
                    

                (cons 1 tex)
                    (cons 7 (cdr (assoc 7 (entget (ssname ss n)))))
                    (cons 50 (cdr (assoc 50 (entget (ssname ss n)))))
                    (cons 100 "AcDbText")
                (cons 8 "UAN")
                    )
                  )
                )
              (setq n (1+ n))
              ) 
            )
          )
        (princ)
        )

    • Like 1

  4. Sao máy mình vẫn chuyển được nhỉ, nếu chắc cú hơn bạn có thể thêm cú pháp

    (cons 8 "Ten_layer_muon) vào ngay sau (cons 100 "AcDbText") là được nhé (trong cú pháp của Bee hơi thừa đoạn kiểm tra layer ban đầu thì phải

    Mà trong file bạn gửi, không thống nhất nhé: có có cú pháp "T 34/23.3" và cú pháp "T34/23.3) tức là có và không có khoảng trắng, có cần xử lý cái không có khoảng trắng không

    • Like 1

  5. Sửa thẳng từ bài viết của  Bee

     

    (defun c:test  (/ N POS SS VALUE)
      (if (not (tblsearch "LAYER" "@TEN"))
        (command "Layer" "M" "@TEN" "")
        )
      (if (setq ss (ssget (list '(0 . "TEXT")
                  (cons 1 "* */*"))))
        (progn
          (setq n 0)
          (repeat (sslength ss)
            (setq value (cdr (assoc 1 (entget (ssname ss n)))))
            (if (and (setq pos1 (vl-string-search "/" value 1))
             (setq pos2 (vl-string-search " " value 1)))
              (entmake
                (list
                  (cons 0 "TEXT")
                  (cons 100 "AcDbText")
                  (cons 10 (trans (cdr (assoc 10 (entget (ssname ss n)))) 1 0))
                  (cons 40 (cdr (assoc 40 (entget (ssname ss n)))))
                  (cons 1 (substr value (+ pos2 2) (- pos1 pos2 1)))
                  (cons 7 (cdr (assoc 7 (entget (ssname ss n)))))
                  (cons 50 (cdr (assoc 50 (entget (ssname ss n)))))
                  (cons 100 "AcDbText")
                  )
                )
              ) ;if
            (setq n (1+ n))
            ) ;repeat
          ) ;progn
        ) ;if
      ) ;defun

     

    [\list]

    • Like 1

  6. Mọi người cho em hỏi

    Em đang sử dụng VBA (viết trên EXCEL 2016) để làm một số công việc của bản thân và đồng nghiệp

    Sau khi viết xong, file *.xlsm  chạy rất tốt trên máy của em (nhiệm vụ của File - tự động lọc, ghi xuất dữ liệu được xử lý trên chính file xlsm này để tạo ra một file xlsx khác (giả sử gọi là file "nguon.xlsx"; sau đó file "nguon.xlsx" đó sẽ được sử dụng làm nguồn để Mail Merge tự động vào Word)

     

    - Vấn đề: do cần sự liên kết giữa Word và Excel mà em cần khai báo thư viện cho VBA như sau:

    2018-06-30_102101.thumb.png.cc551308ad26c13441ae1d4282fcee7e.png

     

     

    Tức là cần khai báo thêm thư viện: Microsoft Word 16.0 Object library + MS office 16.0 Object Libarary 

    thế là oẳng luôn

    khi sang máy khác (không sử dụng Office 2016) file hết đường chạy, ngay cả những hàm có sẵn của VBA Excel (ví dụ Mid, Left ) cũng không chạy được

    XIn hỏi mọi người cách xử lý ạ


  7. Ngố quá, đã làm được rồi, mình đang áp dụng cách này, mọi người ai bị thử xem có được không nhé

    1. Nguyên bản của cài đặt máy (giữ nguyên như hai hình trong web)

    2. Trong office sửa như sau (mục tiêu: chuyển Edditing language từ Mặc định : english về Tiếng việt  (mở Office/File/Opition/language/Chọn ngôn ngữ Vietnamese sau đó chọn Deafault (như trong máy mình đã làm xong rồi nên không làm nữa)

     

     

    xong rồi, giờ chỉnh trong Word để được như ý nào: (nhớ chọn là /# #.#,#)

     

     

    Giải thích (theo ý hiểu thôi nha, không đúng mong mọi người chỉ lại)

     

    /# #.#,#

    /#: có tác dụng, hướng dẫn Word (format) định dạng cho data này là kiểu số (type num)

    #.# có tác dụng chỉ rõ cách phân cách các số hàng (tỷ, triệu, nghìn, trăm, .... nói chung là 3 số 1) là dùng ký tự "."

    ,# có tác dụng chỉ rõ dấu thập phân được ký hiệu là ","

     

     

    Mong mọi người đóng góp ý kiến.

    https://youtu.be/q6jp3VA_iEI

    https://youtu.be/q6jp3VA_iEI


  8. Mọi người cho em hỏi, sau khi cài G8, có lẽ do có một số thiết lập nào đó, mà máy tính chuyển về định dạng hiển thị của Việt Nam (chẳng hạn, giờ chuyển từ "AM/PM" sang "SA/CH"; còn hiển thị dấu phân cách hàng nghìn là ".", phân cách hàng thập phân là ",")
    điều này rất OK, không có gì bất tiện cho đến khi em sử dụng chức năng Mail Merge của Word với nguồn là file excel có data là số (ví dụ 1.234.567,01 - một triệu, hai trăm ba mươi tư nghìn, năm trăm sáu mươi bảy phẩy không một)
    Thì lúc này trong word không hiển thị như mong muốn (1.234.567,01) mà hiển thị 123456.01
    em cũng tra google rồi nhưng mấy cách \# ###. và vài cách khác vẫn không thành công

     

    11111111111.png
    Mọi người có giải pháp nào cho việc này không ạ

    Còn đây là cài đặt trong máy hiện nay của em
    2222222222.png

     

     

    và 

    333333333333.png

     

     

    hoi cadviet.rar


  9. Thuật toán tạm hiểu như sau:

    * Với lệnh chính (C:COBLK)

                   Đúng như những gì bạn nhận định chọn (và  chỉ được chọn)  bằng cách quét chuột các đối tượng là BLOCK; sau  đó lặp qua toàn bộ đối tượng này, thực hiện thủ tục cobylayer (được ghi bên dưới) cho từng đối tượng: Mục đích đổi màu toàn bộ đối tượng bên trong BLOCK được chọn về layer bylayer (CHÚ Ý: lệnh này không có tác dụng đối với block không tên = BLock được "dán" bằng lệnh CTRL+V 

    * Với thủ tục cobylayer 

                  Cứ căn cứ theo code lệnh thì tạm hiểu như sau:

                  + Bước 1: đối với đối số đầu vào blk (kiểu của blk là ename) -> lấy ra tên của BLOCK thông qua lệnh (setq s (cdr (assoc 2 (entget blk))))

                  + Bước 2: do ename blk lấy (hoặc đưa vào) ở bước 1 chỉ là 1 trong số nhiều thằng cùng tên (gán ở biến s ở trên) (chẳng hạn có nhiều thằng lái xe tuyến Hà Nội - Sơn La như 26k-50123; 26k10001;26k0001;.........cho nhà xe "Ân Vân") do vậy cần "tuyển" lấy một thằng chung chung nào đó để làm thay đổi chung (kiểu của nó dạng enname); Cách này được làm như sau: Truy nhập ename (cái chung cần tìm vừa nói) trong "bộ sưu tập" (thư viện, ...) Danh mục quản lý BLOCK của CAD bằng câu lệnh  (cái chung này chính là thằng chủ tuyến "Ân Vân")

                                                    (setq e (cdr (assoc -2 (tblsearch "BLOCK" s))))

                  + Bước 3: thì đơn giản rồi, sau khi có được tên của thằng chung chung cần quản lý, chỉ cần xử lý với mình nó thôi, (chẳng hạn thay đổi giá vé Hà nội - Sơn La từ 190.000đ thành 250.000đ và của thằng nhà xe Ân Vân, thì các lái xe của tuyến nó sẽ phải tự tăng giá theo nè)

                             Cái khó trong bước này là bước duyệt từng đối tượng trong Block (do Block là tập hợp = nhóm nhiều đối tượng Cad: Line, Text, Mtext, dim , hatch,.....) nên để duyệt từng thằng thì cần đến lệnh (entnext)   bồ cứ tìm thằng này trên mạng (google.com.vn) sẽ dễ hơn

                             Hoặc hiểu (setq e1 (entnext e)) sẽ tìm thằng được khởi tạo sau e (e, e1 tất cả ở dạng ename nhé) nếu như là không gian bình thường (model , layout) thì thứ tự này là sự xuất hiện lần lượt khi thực hiện Cad ví dụ như tại thời điểm 9:00 AM Cad ghi nhận vẽ Line (và lưu ename của Line này là e), sau đó vẽ tiếp Circle, sau đó là DIM, hatch,....

               thì khi thực hiện lệnh (setq e1 (entnext e) sẽ cho ra Circle

                                                      (setq e1 (entnext e1) sẽ cho DIM

                                                      (setq e1 (entnext e1) sẽ cho hatch

                                                     cứ như vậy cho đến khi hết không gian layout, model (bằng hết đối tượng, )

                                                    Còn khi không gian là BLOCK thì vẫn như trên nhưng không gian lấy đối tượng đi sau chỉ giới hạn trong không gian đối tượng Block thôi

                  P/S trong code có một đoạn Lặp (trong toán học gọi là đệ quy) khi nào hiểu được những phần trên thì bạn tìm hiểu tiếp nhé, khá hay

    • Like 1
    • Vote tăng 1

  10. hóng cao nhân giúp e cái này: e đang vẽ cái hình hộp 3d, mà trục tọa độ của nó là truc Z thẳng đứng tạo với trục X nằm ngang bên phải là 90 độ, trục X lại tạo với trục Y 1 góc là 135 độ, trục Y lại tạo với trục Z là 135 độ, ai giúp e định vị đc cái tọa độ này với ạ, thường trong cad có mấy cái trục e thử hêt rồi ko phải giống  cái trục này ạ

    101306_drawing2model.png

    Nó là như thế này này, cơ mà nếu là để vẽ trong 2d (tức vẽ trên giấy vẽ), bạn cần lắm chắc kiến thức về suy biến hình, kích thước

     

    Trong hình nếu XYZ2 thì theo ý bạn, nhưng mà mình nhớ ngày sửa là XYZ1

    2 trục X và Z không suy biến kích thước, trục Y suy biến bằng 1 nửa kích thước thật thì phải, lâu quá rồi, không nhở rõ nữa

     

    P/S mà đây rồi, lên GG tìm "hình chiếu trục đo xiên góc cân" nhé


  11. Xin chào ace mình đang có vấn đề thế này, cty mình trang bị cho mỗi ae 2 màn hình máy tính, lúc làm việc excel thì mình mở 2 file cùng lúc và kéo 2 file này hiển thị ở 2 màn hình được, nhưng cad thì mỗi lần mở 2 file mình muốn mỗi file ở 1 màn hình để xem thì mình bấm kéo qua màn hình 2 thì thì file kia cũng đi theo không thể xem ở 2 chế độ màn hình, ace nào đã từng bị như mình khắc phục được rồi xin chỉ cho thằng e với, thank

    Oi cái ông này muốn như thế này hửm

    http://www.cadviet.com/upfiles/7/101306_tep_000.jpeg

    Đơn giản 

    Là thay vì mở 1 lần ứng dụng Autocad, rồi mở lần lượt 2 file dwg (cách làm này thì Cad chỉ hiện 1 file DWG hiện thời thôi, file kia sẽ "ẩn sau lưng")

    Thì HÃY LÀM NHƯ SAU:

     mở 2 ứng dụng Cad, sau đó CTRL + O của từng cái ứng dụng, rồi chọn file mà mở nhé

    • Like 1

  12. Công việc của em đang làm là Quy hoạch mạng lưới thoát nước mưa. Trong đó các thông số của cống em sử dụng Dimension như trong file Autocad đính kèm. Đại khái các Dimension của em sẽ gồm Prefix (tiết diện cống) + giá trị Dim (Chiều dài) + Suffix (độ dốc). 

    Giờ em muốn lập bảng excel thống kê Tổng chiều dài của từng loại cống. Em định lọc giá trị tiết diện cống và chiều dài (hoặc tổng chiều dài) tương ứng.

    Các bác có thể giúp em viết lisp để xử lý bài toán này không ạ?

    Hoặc là có thể xuất tổng giá trị các Dim của 1 loại Dim Style cũng được ạ.

    Em không biết gì về Lisp cả nên phải đi nhờ em cũng ngại lắm.

    Rất mong được các bác giúp đỡ. Em cám ơn nhiều ạ!

    http://www.cadviet.com/upfiles/7/124491_kl_tnm_2.dwg

    (Cấu trúc Dim của em thế này ạ)

    124491_capture.png

    Bạn cho kết quả ra thế nào đi, làm được nhưng cách chọn lọc kết quả như thế nào chứ, hay cứ xuất tạm ra excel rồi dùng lọc có sẵn trong Excel nhé
    • Vote tăng 1

  13. Tình hình là mình có 1 bảng thống kê thép dạng block, bây giờ muốn tổng hợp khối lượng theo dạng riêng từng loại fi6, fi8... mà không biết làm cách nào để chọn. Bình thường vẫn phá block ra, nhưng do nhiều quá nên không khả thi. nhờ ae ai có cách hay lisp gì thì bảo với mình với

     

    http://www.cadviet.com/upfiles/7/13898_cadviet.dwg

    Cái này là phần mềm LISP xuất ra mà, tìm phần mềm tương ứng mà dùng thôi, mình không xài cùng loại nên không chắc, mất công "X" ra làm gì?

  14. Xin lỗi không phải mình khó khăn cái bản vẽ làm gì đâu ah, tại vì mình cho rõ bạn cần cái gì ah? gửi bạn bản Cad nhé của hệ ống gió, mong nhận được sự giúp đỡ của bạn.

    http://www.cadviet.com/upfiles/7/161108_bOc_khOi_lUOng_Ong_giO.dwg

    Bạn đã thử dùng LISP của mình chưa, mình thấy áp dụng được ngay mà,nếu muốn tiện hơn thì sửa (setq lst (loc_tap_ss ss '("TEXT" "DIMENSION"))) thành (setq lst (loc_tap_ss ss '("MTEXT" "DIMENSION")))

    là xong (thêm "M" trước "TEXT")

    Cách dùng:

    1. Gõ lệnh

    2. Quét chợn MTEXT/(TEXT)/DIM , lisp tự lọc: nếu có MTEXT và DIM thì lisp vào ngay tính toán, nếu chỉ có cái này k0 có cái kia, LISP sẽ yêu cầu điền lại giá trị chưa có, LISP cũng cho phép nhập lại chiều dài của đoạn ống (nếu USER thấy cần thiết). Sau đó do chẳng biết điền kết quả vào đâu lên đành dùng thông báo của CAD

    3. File của bạn tắc trách quá: không chỉ rõ nội dung tập trung vào đâu, không chỉ rõ kết quả sẽ ra sao?, tại sao lại dùng DIM 100:1 (DIMLFAC=100; giá trị thực của đo = Cad giữa 2 lần PICK điểm sai khác (nhỏ hơn 100) lần giá trị nếu dùng DLI để đo)

    • Vote tăng 1

  15. Chào các bác

    em muốn trích xuất giá trị ghi trong dimension và kéo thẳng lên phía trên thành dạng mtext như file cad đính kèm.

    https://drive.google.com/open?id=0B_ToehCkY5kzWkxNYjFTWXdIMnM

    Nhờ các bác giúp vì hiện tại em đang làm rất thủ công là copy cái dimension ra và explore để lấy giá trị trong dim, mà công việc của em làm điều này rất nhiều lần, khiến em mất rất nhiều thời gian.

    Lisp e muốn như này:

    Gõ lệnh cxt

    Pick chọn vào giá trị ghi trong dimension và kéo thẳng lên pick vào điểm bất kì muốn đặt giá trị mtext.

    Mong các bác giúp đỡ.

    Thanks !

    Đây cơ mà Khi Pick, chú ý Pick vào đúng MTEXT của DIM nhé, thì LÍP mới hoạt động

    (defun c:cxt(/ dt ent p)
      (vl-load-com)
      (if (setq dt (car(nentsel "\Pick DIM")))
        (progn
          (setq ent (entget dt))
          
          (setq p (getpoint (dxf 10 ent) "\nChon diem moi"))
          (entmakex
    	(append
    	  (list
    	    '(0 . "MTEXT")
    	    '(100 . "AcDbEntity")
    	    '(100 . "AcDbMText"))
    	  (vl-remove-if-not '(lambda(x) (member (car x) '(8 7 1 62 40 41 42 43 50 70 71 72 73)))  ent)
    	  (list (cons 10 p))
    	  )
          )
          ))
      (princ))
    

  16. Chào bạn quansla, cảm ơn vì đã phản hồi. Bạn cần file bản vẽ hay sao vậy?. ý tưởng của bạn về việc Dim chiều dài ống trước sau đó pick chọn để lấy thông số cũng hay, nhưng ví dú mình muốn lisp cho phép thực hiện thao tác đo bằng cách kích 2 điểm để lấy giá trị chiều dài L trước được ko?, khi đó mình không cần phải DIM trước.

     

    Được nhưng vẫn cần FILE bản vẽ, bạn đưa lên đây đi; chứ biết bạn có file thế nào, dữ liệu đầu vào thế nào, đầu ra cho kết quả vào đâu, giá trị chiều dài, pick điểm được kích thước mm, hay m; file thôi mà khó khăn thế?

    (defun loc_thong_tin_str(str / pos str1 str2)
      ;(loc_thong_tin_str "300x200")
      (vl-load-com)
      (if (setq pos (vl-string-search "x" str)) (setq str1 (substr str 1 pos) str2 (substr str (+ 2 pos) 8)))
      (list str1 str2)
      )
     
    (defun loc_tap_ss(ss lst / lst2 name r r2)
      ;(setq lst '("TEXT" "MTEXT" "DIMENSION"))
      ;(loc_tap_ss ss '("TEXT" "MTEXT" "DIMENSION"))
      ;(setq dt (car ss))
      (setq lst2 (mapcar 'list lst))
      (foreach dt ss
        (if (member (setq name (dxf 0 (entget dt))) lst)
          (progn
    (setq r (assoc name lst2))
    (setq r2 (append r (list dt)))
    (setq lst2 (subst r2 r lst2))
    )))
      lst2
      )
     
    (defun dxf (n ent) (cdr(assoc n ent)))
     
    (defun c:thunghiem(/ e1 e2 ent kqdientich l l1 lst r1 ss str)
      (if (and (setq ss (acet-ss-to-list (ssget '(( 0 . "*TEXT,*DIM*")))))
      (setq lst (loc_tap_ss ss '("MTEXT" "DIMENSION"))))    
        (progn
          (if (> (length (car lst)) 1)
    (setq e1 (last(car lst)) str (dxf 1 (entget e1)))
    (setq str ""))
          (if (> (length (last lst)) 1)
      (setq e2 (cadr(last lst))
    L1 (if (= "" (dxf 1 (setq ent (entget e2)))) (dxf 42 ent) (atoi (dxf 1 ent))))
    (setq L1 -100.0))
          (if (= str "") (setq str (getstring "/nNhap lai tiet dien ong dang 200x300")))
          (if (< L1 0) (setq L1 (getdist "/nNhap lai chieu dai ong L= <0.00>")))
          (if (setq L (getreal (acet-str-format "Chon chieu dai ong %1  L=<%2>" str L1)))
    (setq L1 L))
          (if (>= L1 1000) (setq L1 (* L1 0.001)))
          (setq kqDientich (* 1e-6 2 (apply '+ (mapcar 'read (setq r1 (loc_thong_tin_str str)))) L1))
          (alert (acet-str-format "Gia tri tinh toan S= 2*(%1+%2)*%3m=%4 m2" (read (car r1)) (read (cadr r1)) L1 kqDientich))
          )
        )
      (princ)
      )
    
    P/S đã sửa lại theo #8 (làm được với đầu vào là MTEXT, sửa lại công thức)

  17. Mong nhận được sự giúp đỡ của mọi người.

    Khó thế, cho xin cái File đê, nếu muốn nhanh thì có thể không, DIM (cái dim ghi chiều dài L) làm trước (khi sử dụng LISP chỉ việc Pick chọn nó được không, hoặc Pick chọn đường LINE nào đó để lấy chiều dài ống; cũng yêu cầu như vậy với MTEXT (hoặc TEXT) 350x200 và 500x250 được không, chứ lúc đó mà nhập tay thì rườm rà quá

×