quansla
-
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
-
-
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
- 1
-
Lười thế, sao không làm block động cho nó xong, 2 đường Parameter, một ấn định chiều rộng đường line con, một định hướng chiều dài cẩn rải line con, Hatch, để có mà rác toàn file bản vẽ à, chưa kể hatch thế, sau này chuyển file cho máy khác thì dùng làm sao?
- 1
-
Lấy lấy kí tự
trong AutoLisp
Đâ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)
)
- 1
-
(defun loc_rieng_so_dautien(str / i l n vl-str)
-
Lấy lấy kí tự
trong AutoLisp
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
- 1
-
Lấy lấy kí tự
trong AutoLisp
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]
- 1
-
Gõ lệnh "LAYTRANS" để sửa nhé , search google để rõ hơn
-
1 giờ} trướ}c, dinhvantrang đã nói:Bác đang dùng khai báo sớm, chuyển sang khai báo muộn là dùng cho mọi version
https://software-solutions-online.com/vba-write-excel-values-to-word-document/
Cảm ơn anh, chính là thứ em đang cần, chúc anh luôn vui khỏe, hạnh phúc ạ :D
-
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:
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ý ạ
-
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
-
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
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
và
-
Hỏi về lisp
trong AutoLisp
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
- 1
- 1
-
bạn đính kèm file theo link khác đê, link này không tải được
-
Không tải được file nhé thớtkhông có bác nào giúp em với ạ T_T
Quan trọng nhất là ghi với nét Polyline, còn cái khác được thì tốt, ko được cũng ko sao
-
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 ạ
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 cơ
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é
-
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é
- 1
-
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é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 ạ)
- 1
-
Ko có cao thủ nào giúp được mình à, mình thấy đây là lisp rất cần thiết với những người bóc tách khối lượng, mình đang làm việc đó hàng ngày mà chưa có cách nào nhanh hơn được
Bác chẳng có file, không có hướng dấn thì ai dám giúp bác
-
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ì?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
-
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")))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
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)
- 1
-
ờ nhể, mình điên rồi, :DSao dài thế?!!! Làm cái ngắn hơn tý!
-
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))
-
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) -
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á
-
Mình không biết về VBA nhưng nếu remove định dạng TEXT thì có thể tham khảo CODE của LISP có được không (xem nguồn từ LEE nhé)
http://www.lee-mac.com/unformatstring.html- 1
Nhờ chỉnh sửa lisp dimension
trong AutoLisp
Đã đăng · Trả lời báo cáo
Đây nhá: