PHONGVAN1804 1 Báo cáo bài đăng Đã đăng Tháng 8 29, 2011 Mình có một yêu cầu như thế này: Mình có 3 text thuộc 3 layer khác nhau đặt tên là cd1, cd2, cd3. Mình có yêu cầu là dùng một lệnh chon đồng thời 3 text thì nó sẽ cộng text trong layer cd1 và cd2 rồi ghi kết quả vào layer cd3. Giúp mình với đang rất cần. Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
ketxu 2.984 Báo cáo bài đăng Đã đăng Tháng 8 29, 2011 Ồ, bạn có chắc là mỗi lần chỉ chọn 3 đối tượng không ? Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
phamthanhbinh 3.146 Báo cáo bài đăng Đã đăng Tháng 8 29, 2011 Mình có một yêu cầu như thế này: Mình có 3 text thuộc 3 layer khác nhau đặt tên là cd1, cd2, cd3. Mình có yêu cầu là dùng một lệnh chon đồng thời 3 text thì nó sẽ cộng text trong layer cd1 và cd2 rồi ghi kết quả vào layer cd3. Giúp mình với đang rất cần. Hề hề hề, Bạn hãy gửi file mẫu lên nhé, việc viết lísp không khó nhưng để viết đúng yêu cầu của bạn lại là việc không dễ. Bạn hãy giúp mọi người bằng cách post bản vẽ có đấy đủ các yêu cầu của bạn chứ chỉ nói xuông thế này khó hiểu đúng lắm..... Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
lp_hai 225 Báo cáo bài đăng Đã đăng Tháng 8 30, 2011 Em nghĩ bác ấy nói chung chung là vậy, nhưng thực ra là có thể có nhiều layer hoặc ít hơn. Cách giải quyết là cho bác ấy chọn thoải mái nhưng kết quả ghi ra là theo layer thậm chí cở chữ font chữ theo đối tượng đầu tiên được chọn. 1 Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
PHONGVAN1804 1 Báo cáo bài đăng Đã đăng Tháng 8 30, 2011 Em nghĩ bác ấy nói chung chung là vậy, nhưng thực ra là có thể có nhiều layer hoặc ít hơn. Cách giải quyết là cho bác ấy chọn thoải mái nhưng kết quả ghi ra là theo layer thậm chí cở chữ font chữ theo đối tượng đầu tiên được chọn. Mình gởi file lên mấy bạn giúp mình xem thử , mới biết lisp sơ sơ chưa làm được mấy cái này http://www.mediafire.com/?wh4nx1y0acbynm0 Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
ketxu 2.984 Báo cáo bài đăng Đã đăng Tháng 8 30, 2011 Nếu bạn đã biết sơ sơ rồi mình gợi ý bạn làm tổng quát nhé :) Hãy tự tay làm để thấy kết quả 1. Chọn hàng loạt text : bao gồm text ở cả 3 layer bằng ssget ,và lấy ví dụ chỉ ghi kết quả vào 1 tượng thuộc CD3 : (setq ss (ssget (list (cons 0 "TEXT,MTEXT")(cons 8 "CD1,CD2,CD3")))) 2. Khởi tạo biến tổng bằng 0, biến đếm bằng 0. Biến đếm dùng để duyệt qua tập đối tượng (setq tong 0 i 0) 3. Duyệt qua tập ss, thấy thằng nào thuộc layer CD1, CD2 thì cộng vào tổng : (while (setq txtObj (ssname ss i)) ;Khi nào còn (ssname ss i) thì vẫn chạy vòng lặp(if (wcmatch (cdr (assoc 8 (entget txtObj))) "CD1,CD2") ;nếu thuộc 2 layer CD1,CD2 (setq tong (+ tong (atof (cdr (assoc 1 (entget txtObj)))))) ; thì cộng vào tổng, dùng hàm atof để lọc số (setq eCD3 txtObj));Nếu không phải thuộc CD1,CD2 thì tức là đối tượng thuộc CD3, lấy ra để xử lý ở bước ghi kết quả (setq i (1+ i) ;Tăng biến đếm i );Kết thúc vòng lặp while 4. Ghi text vào eCD3 đã tìm được trong vòng lặp : Sử dụng entmod + subst hoặc dùng vla-put-textstring. Cái này để bạn tự tìm hiểu, nếu thấy không được thì lại alo :) 1 Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
PHONGVAN1804 1 Báo cáo bài đăng Đã đăng Tháng 8 30, 2011 Nếu bạn đã biết sơ sơ rồi mình gợi ý bạn làm tổng quát nhé :) Hãy tự tay làm để thấy kết quả 1. Chọn hàng loạt text : bao gồm text ở cả 3 layer bằng ssget ,và lấy ví dụ chỉ ghi kết quả vào 1 tượng thuộc CD3 : 2. Khởi tạo biến tổng bằng 0, biến đếm bằng 0. Biến đếm dùng để duyệt qua tập đối tượng 3. Duyệt qua tập ss, thấy thằng nào thuộc layer CD1, CD2 thì cộng vào tổng : 4. Ghi text vào eCD3 đã tìm được trong vòng lặp : Sử dụng entmod + subst hoặc dùng vla-put-string. Cái này để bạn tự tìm hiểu, nếu thấy không được thì lại alo :) Thank bạn nhiều, bạn cho mình luôn một file, chứ mình làm lại theo bạn vẫn chưa được, cảm ơn bạn rất nhiều ! Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
ketxu 2.984 Báo cáo bài đăng Đã đăng Tháng 8 30, 2011 À mình xin lỗi, phải có dòng (setq i (1+ i)) ở cuối bước 3 để tăng biến đếm i :) Và chú ý là layer trong bản vẽ của bạn khác với yêu cầu đầu tiên :) Thôi, mình đành viết ra vậy... Bạn chịu khó nghiên cứu các bước...Mình không giỏi viêt Tut nên toàn sai sót, chữa lại cũng chán -_- (defun c:test () (setq ss (ssget (list (cons 0 "TEXT,MTEXT")(cons 8 "CD1,CD2,CD3")))) (setq tong 0 i 0) (while (setq txtObj (ssname ss i)) (if (wcmatch (strcase (cdr (assoc 8 (entget txtObj)))) "CD1,CD2") (setq tong (+ tong (atof (cdr (assoc 1 (entget txtObj)))))) (setq eCD3 txtObj)) (setq i (1+ i)) ) (vla-put-textstring (vlax-ename->vla-object eCD3) (rtos tong 2 2)) ) Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
PHONGVAN1804 1 Báo cáo bài đăng Đã đăng Tháng 8 30, 2011 Mình sửa lại thế này mà sao nó chyaj không thoát khỏi vòng lặp được. (defun c:cht (/ ss tong eCD3 txtOBj) (vl-load-com) (princ "\nCHon cac doi tuong text") (setq ss (ssget (list (cons 0 "TEXT,MTEXT")(cons 8 "CD1,CD2,CD3")))) (setq tong 0 i 0) (while (setq txtObj (ssname ss i)) ;Khi nào còn (ssname ss i) thì v?n ch?y vòng l?p (if (wcmatch (cdr (assoc 8 (entget txtObj))) "CD1,CD2") ;n?u thu?c 2 layer CD1,CD2 (setq tong (+ tong (atof (cdr (assoc 1 (entget txtObj)))))) ; thì c?ng vào t?ng, dùng hàm atof d? l?c s? (setq eCD3 txtObj));N?u không ph?i thu?c CD1,CD2 thì t?c là d?i tu?ng thu?c CD3, l?y ra d? x? lý ? bu?c ghi k?t qu? );K?t thúc vòng l?p while (vla-put-textstring txtObj tong) ) Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác
ketxu 2.984 Báo cáo bài đăng Đã đăng Tháng 8 30, 2011 Bạn không đọc bài trên của mình à :| Lúc đầu mình quên viết dòng tăng biến đếm i, nếu như kia thì vòng lặp cứ xét đi xét lại đối tượng đầu (i = 0) thôi :) Chia sẻ bài đăng này Liên kết tới bài đăng Chia sẻ trên các trang web khác