Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
quansla

[Nhờ sửa list] list thêm dòng text vào dưới Text2

Các bài được khuyến nghị

quansla    232

Em mới viết xong list này, dự định là khi cần thêm vào một dòng Text thẳng cột với dòng các dòng Text trên(cụ thể là dòng Text khi chọn ở (entsel"\nText2 ") trong list)

Ưu điểm của list là có thể thêm chính xác Text nhập vào, và có khoảng cách như 2 Text nhập ban đầu

Nhược điểm là:

Không dừng được list(hix, em dùng hàm (while) với điều kiện là còn nhập vào Text thì còn chèn vào nhưng hàm getstring với tham số T thì chỉ còn cách ESC mới thoát lệnh được)

Không nhập được trực tiếp Text mà phải gõ trên Command(cái này thì không khó chịu lắm nhưng em mún tìm hiểu để dùng cho các list sau này

Vậy em gửi list này nhờ các cao thủ xem giúp em, sửa list, thêm thắt để em khắc phục được nhược điểm của list ạ. Em cảm ơn

List của em đây ạ

(defun c:xyz (/ delta k e2 str p1 p2 oldos)
 (setq oldos (getvar "osmode"))
 (setvar "osmode" 0)
 (setq delta (- (caddr(assoc 10 (entget(car(entsel"\nText1  ")))))
  (if(setq e2(entget(car(entsel"\nText2  "))))
(caddr(assoc 10 e2)))))
 (setq k 1)
 (while (setq str (getstring T (strcat"Nhap Text chen:   " (rtos k))))      
(setq p1(cdr(assoc 10 e2)))
(setq p2(list (car p1) (- (cadr p1) (* k delta)) 0))
(vtext2 str p2 "Text")
(setq k (1+ k))
)
 (setq k nil)
 (setvar "osmode" oldos)
 (princ)
 )



(defun vText2(str p layer ) 
   (entmake
     (list
'(0 . "TEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbText")
(cons 1 str);string
(cons 7 (getvar "textstyle"));style
(cons 8 layer);layer
(cons 62 256);color
(cons 10 p);insertion point
(cons 11 p);alignment point
(cons 40 250);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)
   )

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
Tue_NV    3.841

Em mới viết xong list này, dự định là khi cần thêm vào một dòng Text thẳng cột với dòng các dòng Text trên(cụ thể là dòng Text khi chọn ở (entsel"\nText2 ") trong list)

Ưu điểm của list là có thể thêm chính xác Text nhập vào, và có khoảng cách như 2 Text nhập ban đầu

Nhược điểm là:

Không dừng được list(hix, em dùng hàm (while) với điều kiện là còn nhập vào Text thì còn chèn vào nhưng hàm getstring với tham số T thì chỉ còn cách ESC mới thoát lệnh được)

Không nhập được trực tiếp Text mà phải gõ trên Command(cái này thì không khó chịu lắm nhưng em mún tìm hiểu để dùng cho các list sau này

Vậy em gửi list này nhờ các cao thủ xem giúp em, sửa list, thêm thắt để em khắc phục được nhược điểm của list ạ. Em cảm ơn

List của em đây ạ

(defun c:xyz (/ delta k e2 str p1 p2 oldos)
 (setq oldos (getvar "osmode"))
 (setvar "osmode" 0)
 (setq delta (- (caddr(assoc 10 (entget(car(entsel"\nText1  ")))))
  (if(setq e2(entget(car(entsel"\nText2  "))))
(caddr(assoc 10 e2)))))
 (setq k 1)
 (while (setq str (getstring T (strcat"Nhap Text chen:   " (rtos k))))      
(setq p1(cdr(assoc 10 e2)))
(setq p2(list (car p1) (- (cadr p1) (* k delta)) 0))
(vtext2 str p2 "Text")
(setq k (1+ k))
)
 (setq k nil)
 (setvar "osmode" oldos)
 (princ)
 )



(defun vText2(str p layer )
   (entmake
     (list
'(0 . "TEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbText")
(cons 1 str);string
(cons 7 (getvar "textstyle"));style
(cons 8 layer);layer
(cons 62 256);color
(cons 10 p);insertion point
(cons 11 p);alignment point
(cons 40 250);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)
   )

Muốn thoát khỏi vòng lặp thì bạn dùng điều kiện logic này ở hàm while:

(and (setq str (getstring T (strcat"Nhap Text chen: " (rtos k)))) (/= str ""))

Enter là thoát khỏi vòng lặp

 

Dòng màu đỏ trên : Bạn nói rõ yêu cầu của bạn rõ hơn nhé!

  • Vote tăng 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
quansla    232

Muốn thoát khỏi vòng lặp thì bạn dùng điều kiện logic này ở hàm while:

(and (setq str (getstring T (strcat"Nhap Text chen: " (rtos k)))) (/= str ""))

Enter là thoát khỏi vòng lặp

 

Dòng màu đỏ trên : Bạn nói rõ yêu cầu của bạn rõ hơn nhé!

Aha ra là vậy cảm ơn bác, có lần nhìn kiểu này rồi mà không nhớ ra hì hì, xin lỗi bác ý em là thế này:

Dòng màu đỏ trên : Em mong muốn là khi nhập Text với list thì sẽ nhâp và sửa như khi mình dùng lệnh :DText vậy, còn nếu dùng hàm getstring thì bắt buộc nhập Text cho biến "str" trong list là nhập trên màn hình(tức là giống với khi dùng lệnh "LINE" không nhấp chuột mà gõ chữ "sfsakljf ksjdlafj jasljf" ý ạ, nhìn nó không trực quan

  • Vote tăng 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
quansla    232

(while (/= "" (setq str (getstring T (strcat"Nhap Text chen: " (rtos k)))))

Hì cảm ơn bác, xét ra thì cách viết của bác gọn hơn của bác Tue_NV

  • Vote tăng 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
Tue_NV    3.841

Aha ra là vậy cảm ơn bác, có lần nhìn kiểu này rồi mà không nhớ ra hì hì, xin lỗi bác ý em là thế này:

Dòng màu đỏ trên : Em mong muốn là khi nhập Text với list thì sẽ nhâp và sửa như khi mình dùng lệnh :DText vậy, còn nếu dùng hàm getstring thì bắt buộc nhập Text cho biến "str" trong list là nhập trên màn hình(tức là giống với khi dùng lệnh "LINE" không nhấp chuột mà gõ chữ "sfsakljf ksjdlafj jasljf" ý ạ, nhìn nó không trực quan

Cái này dùng Dtext : hơi bị chua

Chi bằng bật Dynmode lên (set vô trong Lsp) luôn

(setvar "dynmode" 1)

Là nhìn trực quan liền à

 

Đề nghị bạn viết đúng chính tả nhé! LISP chứ không phải list

  • Vote tăng 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
quansla    232

Cái này dùng Dtext : hơi bị chua

Chi bằng bật Dynmode lên (set vô trong Lsp) luôn

(setvar "dynmode" 1)

Là nhìn trực quan liền à

 

Đề nghị bạn viết đúng chính tả nhé! LISP chứ không phải list

Hì thanks bác, hồi đầu nghĩ ra ý tưởng thêm Text này em dùng lệnh Copy Text2 rồi (command "edit"...) luôn, về sau thấy bất tiện quá nên viết lisp này ạ. Hix bác nói em mới để ý, từ xưa đến nay em toàn viết list , ngu quá, một lần nữa cảm ơn bác hihihi

  • Vote tăng 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
Tue_NV    3.841

Hì thanks bác, hồi đầu nghĩ ra ý tưởng thêm Text này em dùng lệnh Copy Text2 rồi (command "edit"...) luôn, về sau thấy bất tiện quá nên viết lisp này ạ. Hix bác nói em mới để ý, từ xưa đến nay em toàn viết list , ngu quá, một lần nữa cảm ơn bác hihihi

Vậy bạn sử dụng Lisp này xem thử ưng bụng không nhé!

(defun c:xyz (/ delta k e2 str p1 p2 oldos)
 (setvar "cmdecho" 0)
 (setq delta (- (caddr(assoc 10 (entget(car(entsel"\nText1  ")))))
  (if(setq e2(entget (setq ent2 (car(entsel"\nText2  ")))))
   (caddr(assoc 10 e2)))))
 (setq k 1 str "Tue_NV")
 (setq p1(cdr(assoc 10 e2)))
 (while (/= str "")
   (princ (strcat "\nNhap Text chen:   " (rtos k 2 0) " : " ))   
   (setq p2(list (car p1) (- (cadr p1) (* k delta)) 0))
   (Command "copy" ent2 "" "_non" p1 "_non" p2) (setq el (entget (entlast)))
   (entmod (subst(cons 1 " ") (assoc 1 el) el))
   (command "ddedit" "L" "")
   (setq str (vl-string-trim " " (cdr(assoc 1 (entget (entlast))))))
   (setq k (1+ k))(princ str)
   )
 (princ)
)

Bạn không thích nhập nữa thì để 1 chuỗi trắng và enter -> Kết thúc là xong

  • Vote tăng 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
ketxu    2.649

(car nil) = error = (entget error) = (caddr(assoc 10 error)) = Real - error = Crash a ơi

=> If ở dòng 4 thừa

  • Vote tăng 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
Tue_NV    3.841

(car nil) = error = (entget error) = (caddr(assoc 10 error)) = Real - error = Crash a ơi

=> If ở dòng 4 thừa

Ket nhận xét dùm cho bạn quansla rồi đấy thôi.

Mình chỉ lo sửa phần ở dưới thôi. Phần trên để bạn ấy .... tự xử

Mà mình thấy bạn ấy viết trong trường hợp pick trúng object Text chứ ko tính đến TH (car nil)

 

Cái Lisp này giống thời hồi xưa mình làm ấy nhỉ? "1" enter "2" enter "3" enter :D

  • Vote tăng 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
ketxu    2.649

À hóa ra nguyên bản của chủ topic ^^

@ quansla : mới tập viết mà sử dụng hàm con tốt thì sẽ sớm ngon lành thôi ^^

Theo mình, nếu được, bạn nên

- Thử chuyển thao tác pick Text1, text 2 thành thao tác quét chọn tập text

- Nếu toàn bộ là Dtext : lấy 2 thằng dưới cùng làm cơ sở, sẽ nhanh và ưng hơn nhiều đấy

- Có 1 Mtext dưới cùng : thì edit xuống dòng

=> Có 1 lệnh continue text hoàn thiện hơ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
quansla    232

À hóa ra nguyên bản của chủ topic ^^

@ quansla : mới tập viết mà sử dụng hàm con tốt thì sẽ sớm ngon lành thôi ^^

Theo mình, nếu được, bạn nên

- Thử chuyển thao tác pick Text1, text 2 thành thao tác quét chọn tập text

- Nếu toàn bộ là Dtext : lấy 2 thằng dưới cùng làm cơ sở, sẽ nhanh và ưng hơn nhiều đấy

- Có 1 Mtext dưới cùng : thì edit xuống dòng

=> Có 1 lệnh continue text hoàn thiện hơn

Cám ơn các bác đã quan tâm, hôm nay thu được nhiều kinh nghiệm quá hì hì

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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×