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

Thaistreetz

Nhà quảng cáo
  • Số lượng nội dung

    905
  • Đã tham gia

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

  • Ngày trúng

    30

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


  1. Trong khi vẽ, đôi khi ta chọn đối tượng trước rồi mới gõ lệnh và cad hiểu những đối tượng vừa chọn đó là để phục vụ cho lệnh vừa nhập. VD: khi muốn xóa một đối tượng nào đó, ta có thể chọn đối tượng trước hoặc sau khi gõ lênh erase. Vậy muốn làm việc này với lisp thì ta phải viết như thế nào?

    Cụ thể với lisp sử dụng hàm SSGET ngay đầu lisp để chọn đối tượng muốn xử lý.


  2. Thế nếu bản vẽ có số lượng cực lớn, thì lại phải chọn toàn bộ các đối tượng ở vùng đó để Earse đi hả bác? Nếu dung lượng bản vẽ mà lên đến 50M thì em nghĩ là ko thể dưới 1 phút được đâu!

    Đây là một trường hợp bạn tưởng tượng ra để nói. Một bản vẽ lên đến 50M, bạn chẳng thể vô tư vạch 1 đuờng line rồi cắt phéng 1 nhát cho bay luôn một phần bản vẽ.

    Với mình mỗi một đối tượng trên bản vẽ, trước khi xoá đi mình luôn fải cân nhắc xem chắc chắn mình có muốn xoá nó ko. vì xoá thì nhanh lắm, nhưng vẽ thì mất công hon rất nhiều.

     

    Mình đồng ý với ý kiến của Trang. Mặc dù lisp giúp hỗ trợ tự động hoá công việc khá tốt. Nhưng nếu lê thuộc vào lisp quá nhiều sẽ khiến khả năng thao tác với cad rất kém. Trước khi đến với Lisp, mình đã tương đối hài lòng với những gì mà cad cung cấp.


  3. Để căn lề cho text, ngoài việc chỉnh mã Dfx 72, 73 còn fải chú ý đến 2 mã 10 và 11 (điểm chèn và điểm canh lề - hình như vậy). Với các text căn lề mặc định (72 . 0) (73 . 0) thì ko cần quan tâm tới mã 11 . Nhưng nếu chỉnh sửa 2 mã 72, 73 # 0 mà ko chỉnh lại mã 11 thì text sẽ bị ...bay về gốc 0. Cho nên fải thêm đoạn gán mã 11 bằng (x, y, z) mong muốn

    Vừa hay em mới viết xong cái lisp căn lề text. Em giải quyết vấn đề này bằng cách lấy toàn bộ các thuộc tính của text được chọn, xóa text đó đi rồi viết lại text khác tại vị trí mới với nội dung và thuộc tính (Value, style, layer, color, hight text) giống hệt text cũ.

    Bạn dovanlinh có thể tham khảo thêm tại đây


  4. Trước đây mình có thấy trong diễn đàn đã cung cấp công cụ căn lề text theo 3 kiểu Left, Center, Right. Tuy nhiên công cụ này ko viết bằng autolisp và chỉ chạy được các bản cad 2004, 2005 và 2006 nên mình viết một lisp tương tự để chạy được trên tất cả các bản cad.

    - Lisp yêu cầu chọn tất cả các text (Dtext va MText) cần căn lề.

    - Chọn một text làm chuẩn để căn lề các text đã chọn theo text đó

    - Ngoài chức năng căn lề theo 3 vị trí. Left, Center, Right thì lisp này cung cấp thêm chức năng căn lề theo kiểu Fit, - kéo dãn các dòng cho dài bằng nhau (giống word) và dài bằng text chọn làm chuẩn.

    canletxt.jpg

    (defun c:ft()
    (command "undo" "begin")
    (setq oldos (getvar "osmode"))
    (setq olcol (getvar "CEColor"))
    (setq olstyle (getvar "textstyle"))
    (prompt "\nchon cac text can can le ...")
    (setq txt (ssget '((0 . "*TEXT"))))
    (setq mau (entget (car (entsel "\nChon text chuan"))))
    (setq TB  (textbox mau) LC  (car TB) RC (cadr TB) di (distance LC RC) i 0)
    (setq x1 (cdr(assoc 10 mau)))
    (setq x2 (list (+ (car x1) (* di 0.5)) (cadr x1)))
    (setq x3 (list (+ (car x1) di) (cadr x1)))
    (setq canle (cond (canle) ("Left")))
    (initget "Left Center Right Fit")
    (setq canle (cond ((getkword (strcat "\Vi tri can le [Left/Center/Right/Fit/]<" canle ">"))) (canle)))
    (repeat (sslength txt)
    (setq txt_ent (entget (ssname txt i)))
    (setq txt_val (cdr(assoc 1 txt_ent)))
    (setq txt_st (cdr(assoc 7 txt_ent)))
    (setq txt_lay (cdr(assoc 8 txt_ent)))
    (setq txt_h (cdr(assoc 40 txt_ent)))
    (setq txt_fctr (cdr(assoc 41 txt_ent)))
    (setq txt_clr (cdr(assoc 62 txt_ent)))
    (setq y1 (cdr(assoc 10 txt_ent)))
    (if (cdr(assoc 43 txt_ent)) (setq txt_fctr 1 y1 (list (car y1) (- (cadr y1) txt_h))))
    (setq pt1 (list (car x1) (cadr y1)))
    (setq pt2 (list (car x2) (cadr y1)))
    (setq pt3 (list (car x3) (cadr y1)))
    (command "-style" txt_st "" "" txt_fctr "" "" "" "" "clayer" txt_lay "color" txt_clr "osmode" 0)
    (if (eq canle "Left") (command "text" pt1 txt_h 0 txt_val))
    (if (eq canle "Center") (command "text" "C" pt2 txt_h 0 txt_val))
    (if (eq canle "Right") (command "text" "R" pt3 txt_h 0 txt_val))
    (if (eq canle "Fit") (command "text" "F" pt1 pt3 txt_h txt_val))
    (setq i (+ i 1))
    (command "color" "bylayer")
    );repeat
    (setvar "textstyle" olstyle)
    (setvar "CECOLOR" olcol)
    (setvar "osmode" oldos)
    (command "erase" txt "")
    (prompt"\n[CAN LE TEXT] by Thaistreetz - huuthais@yahoo.com\n")
    (command "undo" "end")
    );defun
    

    Hiện tại thì mình đã khá hài lòng với lisp này nếu chỉ dùng để căn lề text. Tuy nhiên mình muốn thêm cho nó chức năng giãn dòng cho đều cũng với cách nhập số liệu như trên nhưng đang mắc về thuật giải. Xin nhờ mọi người giúp mình hoàn thiện lisp này với.

     

    Edit: đã fix lỗi

    • Vote tăng 5
    • Vote giảm 2

  5. Em có được đọc topic về lisp xóa toàn bộ đối tượng trong vùng khép kín ở đây: http://www.cadviet.com/forum/index.php?showtopic=11747 Em muốn thay đổi lisp để có thể xóa toàn bộ các đối tượng nằm về 1 phía của 1 đường thẳng như trong ví dụ này http://www.cadviet.com/upfiles/2/vi_du.dwg. Nhờ bác Thiep và bác Gia_bach và các bác am hiểu về lisp sửa giúp nhé :s_big:

     

    Với các công cụ của cad bạn làm việc này cũng chẳng mất bao nhiêu công sức và thời gian mà. Bạn thử lệnh extrim của express tool chưa?lisp chi cho rắc rối hả bạn.


  6. Giúp em với, sao em tạo cái vòng lặp mà không được nhỉ?

    Chắc bạn ấy đang viết dở anh nataca ạ :s_big:

    Điều kiện lặp của bạn là tx2 khác nil. như code của bạn thì nó thoát khỏi vòng lặp ngay sau lần lặp đầu tiên là đúng rồi.

    bạn thêm dòng (setq tx2 (entsel "\nSelect next text:")) ngay trước khi đóng while là được.


  7. Thế bác ơi!Nếu em chỉ muốn lọc ra số và chữ riêng biệt thì phải làm sao?(chỉ đơn thuần là lọc ra 2 loại)

    Em thử dùng lisp "cso" nhưng nó cộng với 1 số thập phân và sau khi muốn lựa chọn lại text số thì nó lại chọn cả text chữ.

    đoạn code của bác Gia Bach là cái bạn đang cần đó thôi.

    (if (distof str 2) (thỏa mãn thì là số) (ko thỏa mãn thì là chuỗi ký tự))


  8. Xuất ra bảng thống kê giao thông, gồm :

    ----------------------------

    stt - tên điểm - Tên đường - toạ độ X - Toạ độ Y - Cao độ Tự nhiên - Cao độ Thiết kế - Chiều dài Cạnh - Ghi chú.

    ----------------------------

    Trên bảng tọa độ trên, thì khi thực hiện ta chọn lần lược theo cạnh, Điểm 1 và điểm 2 ( trong qúa trình chọn điểm này sẻ ghi tên điểm tùy ý ) , kết thúc việc đánh dấu điểm chọn 1 cạnh, yêu cầu nhập tên đường, CDTN,CDTK, xong ........>> xuất ra bảng theo các nội dung ở trên và kẻ khung kết thúc cạnh 1.

    Và chọn tiếp cạnh 2, thực hiện như trước....> xuất kết qủa nối vào bảng trên.

    Yêu cầu trên của bạn và bản vẽ bạn up không giống nhau một chút nào. Mình chịu thua :s_big:


  9. Cảm ơn bạn lisp chạy rất hay, mình nhờ bạn chút nữa được không, mình muốn góc nói như nào nhỉ, để mình gửi file lên nhé, giúp tớ một chút nữa nhé. Mình cũng thử chỉnh lại lisp nhưng mãi không được. Cám ơn bạn trước nhé.

    http://www.cadviet.com/upfiles/2/nha25d.dwg

    File bản vẽ trước bạn up lên cho mình xem là 30 đô. chính xác là 29 độ chứ không fải 25 độ

     

    Góc 25 độ = pi/7.2 rad

    bạn sửa 2 dòng này:

    (setq pt5 (polar pt1 (- goc1 (/ pi 6)) (/ L1 2 (cos (/ pi 6)))))

    (setq pt6 (polar pt3 (+ goc2 (/ pi 3)) (/ L1 -2 (cos (/ pi 6)))))

    thành:

    (setq pt5 (polar pt1 (- goc1 (/ pi 7.2)) (/ L1 2 (cos (/ pi 7.2)))))

    (setq pt6 (polar pt3 (+ goc2 (/ pi 2.769)) (/ L1 -2 (cos (/ pi 7.2)))))

    Chúc bạn thành công.

    • Vote tăng 1

  10. Đây là lisp vẽ nhà dùng để vẽ bình đồ theo cách vẽ của lệnh NHA trong NOVA nhưng đã được đơn giản hóa.

    - khi vẽ chỉ cân pick vào 3 điểm góc của nhà.

    - Lisp vẽ được 2 loại nhà: nhà ngói (hay nhà lá) và nhà tầng với số tầng nhập vào khi vẽ.

    - Với nhà ngói, các đường thể hiện mái ngói được vẽ riêng bằng một layer khác.

    - toàn bộ nhà được vẽ bằng layer NHATOANDAC

    venha.jpg

    (Defun c:nha ( ) 
    (if (not h) (setq h 1))
    (setq h1 (getreal (strcat "\nCao text <"(rtos h 2 2)">:")))
    (if h1 (setq h h1))
    (setq laylast (getvar "clayer"))
    (setq oslast (getvar "osmode"))
    (setq colast (getvar "cecolor"))
    (command "osmode" 109)
    (setq pta (getpoint (strcat "\n pick diem thu nhat")))
    (setq i1 0 i2 0)
    
    (while (/= pta nil)
    (command "undo" "begin")
    (command "color" 1 "circle" pta 1)
    (setq ss1 (ssget "L") ss (ssadd) ss (ssadd (ssname ss1 0) ss))
    (setvar "cecolor" colast)
    (setq ptb (getpoint (strcat "\n pick diem thu 2") pta))
    (command "color" 2 "circle" ptb 1)
    (setq ss2 (ssget "L") ss (ssadd (ssname ss2 0) ss))
    (setvar "cecolor" colast)
    (setq ptc (getpoint (strcat "\n pick diem thu 3") ptb))
    (command "color" 3 "circle" ptc 1)
    (setq ss3 (ssget "L") ss (ssadd (ssname ss3 0) ss))
    (setvar "cecolor" colast)
    (setq L1 (distance pta ptb) L2 (distance ptb ptc))
    (setq ptd (polar pta (angle ptb ptc) L2))
    (if (> L2 L1)
    (setq pt1 pta pt2 ptb pt3 ptc)
    (setq pt1 ptd pt2 pta pt3 ptb))
    (setq L1 (distance pt1 pt2) L2 (distance pt2 pt3))
    (setq goc1 (angle pt1 pt2))
    (setq goc2 (angle pt2 pt3))
    (setq pt4 (polar pt1 goc2 L2))
    (setq pt5 (polar pt1 (- goc1 (/ pi 6)) (/ L1 2 (cos (/ pi 6)))))
    (setq pt6 (polar pt3 (+ goc2 (/ pi 3)) (/ L1 -2 (cos (/ pi 6)))))
    (setq pt7 (polar pt5 goc2 (/ (distance pt5 pt6) 2)))
    
    (setq nha (cond (nha) ("Ngoi")))
    (initget "Ngoi Tang")
    (setq	Tmp1 (strcat "\nNha mai ngoi hay nha tang [Ngoi/Tang] <" nha ">: ")
    nha (cond ((getkword Tmp1)) (nha)))
    (if (not (tblsearch "layer" "NHATOANDAC"))
    (command "-layer" "N" "NHATOANDAC" "S" "NHATOANDAC" "color" 7 "" "")
    (command "Clayer" "NHATOANDAC"))
    
    (if (eq Nha "Ngoi")
    (progn
    (Command "color" bylayer "osmode" 0 "pline" pt1 pt2 pt3 pt4 pt1 "")
    (if (not (tblsearch "layer" "layer1"))
    (command "-layer" "N" "layer1" "S" "layer1" "color" 8 "" "")
    (command "Clayer" "layer1"));if
    (command "pline" pt1 pt5 pt2 "")
    (command "pline" pt5 pt6 "")
    (command "pline" pt3 pt6 pt4 "")
    (command "osmode" 109)
    (setq i1 (1+ i1))
    (setvar "cecolor" colast)
    (command "erase" ss "")
    (command "undo" "end")
    );progn
    (progn
    (setq tang (cond (tang) ("2tang")))
    (initget "2tang 3tang 4tang 5tang 6tang")
    (setq	Tmp1 (strcat "\nNha bao nhieu tang [2Tang/3Tang/4Tang/5Tang/6Tang]<" tang ">: ")
    tang (cond ((getkword Tmp1)) (tang)))
    (Command "color" bylayer "osmode" 0 "pline" pt1 pt2 pt3 pt4 pt1"")
    (if (eq tang "2tang") (command "color" 3 "text" "m" pt7 h 0 "2T"))
    (if (eq tang "3tang") (command "color" 3 "text" "m" pt7 h 0 "3T"))
    (if (eq tang "4tang") (command "color" 3 "text" "m" pt7 h 0 "4T"))
    (if (eq tang "5tang") (command "color" 3 "text" "m" pt7 h 0 "5T"))
    (if (eq tang "6tang") (command "color" 3 "text" "m" pt7 h 0 "6T"))
    (setq i2 (1+ i2))
    (command "osmode" 109)
    (setvar "cecolor" colast)
    (command "erase" ss "")
    (command "undo" "end")
    );progn
    );if
    (setq pta (getpoint (strcat "\n pick diem thu nhat")))
    );while
    (setvar "cecolor" colast)
    (setvar "osmode" oslast)
    (setvar "clayer" laylast)
    (command "undo" "end")
    (prompt (strcat "\nDa ve " (rtos i1 2 0) " nha ngoi va " (rtos i2 2 0) " nha tang\n"))
    (prompt "\nby Thaistreetz - huuthais@yahoo.com\n")
    );end.
    

    Chú ý: Khi pick các điểm góc nhà ngói bạn bắt buộc phải pick lần lượt 3 góc theo chiều quay kim đồng hồ. Mình phát hiện lỗi này sau khi đã viết xong lisp nên ngại viết lại. bạn sử dụng chú ý một chút là ok thôi.

    • Vote tăng 2

  11. Cám ơn Bạn.

    Qua Lisp bạn đã giúp mình thực hiện rất tốt trong công việc.

    Xin nhờ bạn giúp cho thêm các cột của Lisp trên, như sau :

    À, mục đích là thống kê các điểm cũa các đỉnh đường trong giao thông.

    Xuất ra bảng thống kê giao thông, gồm :

    ----------------------------

    stt - tên điểm - Tên đường - toạ độ X - Toạ độ Y - Cao độ Tự nhiên - Cao độ Thiết kế - Chiều dài Cạnh - Ghi chú.

    ----------------------------

    Trên bảng tọa độ trên, thì khi thực hiện ta chọn lần lược theo cạnh, Điểm 1 và điểm 2 ( trong qúa trình chọn điểm này sẻ ghi tên điểm tùy ý ) , kết thúc việc đánh dấu điểm chọn 1 cạnh, yêu cầu nhập tên đường, CDTN,CDTK, xong ........>> xuất ra bảng theo các nội dung ở trên và kẻ khung kết thúc cạnh 1.

    Và chọn tiếp cạnh 2, thực hiện như trước....> xuất kết qủa nối vào bảng trên.

    Rất mong được Bạn giúp.

    Bạn up một bản vẽ của bạn lên cho mình xem đi. trong đó kẻ luôn định dạng bảng thống kê bạn muốn. Mình sẽ viết theo những gì bạn vẽ. đọc yêu cầu thế này mình khó hình dung quá :s_big:


  12. Mình đưa hai file lên đây bạn xem thì hiểu ngay thôi.

    http://www.cadviet.com/upfiles/2/tao_nha_1.rar

    http://www.cadviet.com/upfiles/2/nha.dwg

    Mình ít phải vẽ bình đồ vì hầu hết các công trình mình làm đều có thể xin được bình đồ bên địa chính nên đúng là mình chưa sử dung lệnh này bao giờ cả.

    Để vẽ cái này trên cad bằng lisp thì cũng khá đơn giản, mình có thể làm đc (tất nhiên sẽ không cần quá nhiều nhiều tùy chọn và ko có chế độ preview như Hài Hòa đã làm vì trình độ của mình chưa đủ để làm việc đó).

    Mình sẽ đơn giản hóa nó thế này.

    - Lisp sẽ vẽ 2 loại nhà (có lựa chọn cho bạn khi bắt đâu vẽ mỗi ngôi nhà): nhà mái ngói (giống yêu cầu của bạn) và nhà tầng với số tầng bạn nhập vào

    - Text ghi số tầng của nhà tầng sẽ luôn nằm ngang (góc xoay của text là 0) theo trục tọa độ của bạn trong bản vẽ, chiều cao text bạn phải nhập vào ngay lúc bắt đầu chạy lệnh.

    Ok chứ?


  13. Chào bạn PhamThanhBinh và bạn Thaistreet

    Bạn có thể xem thêm vấn đề này tại đây :

    Viết Lisp theo yêu cầu - Bài viết số 2741

    Bài viết của anh gia bách :

    Chọn Text là số

    và bài viết này nữa :

    Phân biệt Text

     

    @Thaistreet : Tue_NV đã viết bài trả lời bạn ở trang trước. Hy vọng bạn xây dựng Code thành công :cheers:

    Đúng rồi. chỉ cân nhập số muốn chia dưới dạng 1/X là ok, vậy mà em không nghĩ ra.

    cảm ơn anh đã thông tin cho em về hàm distof. có nó thì vấn đề lọc text theo số và chuỗi ký tự đã đc giải quyết một cách đơn giản.

    code em đã sửa lại đây ạ. Em nghĩ thế này là nó đã hoàn thiện. :s_big:

    (defun c:tinh()
    (setq i 0 nhan 1 chia 1 cong 0)
    (setq 	nhan1 (getreal (strcat "\n nhap so muon nhan hoac chia <" (rtos nhan 2 3) ">: "))
    cong1 (getreal (strcat "\n nhap so muon cong hoac tru <" (rtos cong 2 3) ">:")))
    (if nhan1 (setq nhan nhan1))
    (if cong1 (setq cong cong1))
    (prompt "\nchon cac so can sua ...")
    (setq txt (ssget '((0 . "TEXT"))))
    (command "undo" "begin")
    (repeat 	(sslength txt)
    (setq txt_name (ssname txt i))
    (setq txt_ent (entget txt_name))
    (setq cont1 (cdr(assoc 1 txt_ent)))
    (setq cont (atof cont1))
    (if (distof cont1 2)
    	(progn
    	(setq s (+ (* cont nhan) cong))
    	(setq txt_ent  (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
    	(entmod txt_ent));if
    );if
    (setq i (+ i 1))
    );repeat
    (command "undo" "end")
    );defun

    @ bác Thanh Bình: hic, bác ơi, bác đừng gọi em là "bác Thaistreetz" nhé, tổn thọ em mất. Em mới ra trường chưa lâu và so với các bác ở đây chắc cũng chỉ được coi là "tụi trẻ" thôi bác ạ. :s_big:

    • Vote tăng 1

  14. Bác Thaistreetz là dân giao thông chắc bác biết lệnh tạo nhà trong nova bác có thể giúp em viết một lisp tạo nhà giống như thế được không.

    Chào bạn Tuynh

    Quả thật là mình không biết lệnh "tạo nhà" trong nova là lệnh nào. Phải chăng bạn muốn nói đến các loại địa vật vẽ trên trắc ngang? nếu không fải thì bạn cho mình tên lệnh và tên bản nova bạn đang dùng để mình kiểm tra nhé. nếu giúp được mình sẵn lòng.


  15. Nhờ các bạn dúp dùm mình họa đồ trích đo này không có up file theo đó minh đa rât cần.

    text đánh theo thứ tự từ trái qua phải

    bản vẽ gán theo tỷ lệ cho trước

    có kèm theo bảng toa độ

    Bản trích đo: http://www.cadviet.com/upfiles/2/mau_trich_do.dwg

    File bản đồ: http://www.cadviet.com/upfiles/2/dc_4f135ivd.dwg

    Mình thử diễn đạt lại ý của bạn thế này xem có đúng không nhé.

    Bạn có một hình đa giác bất kỳ với n cạnh.

    bạn muốn một lisp có chức năng:

    - pick lần lượt vào các đỉnh của da giác đó lần lượt theo một chiều nhất định (cùng chiều hoặc ngược chiều kim đồng hồ)

    - Lisp sẽ đánh số thứ tự các điểm đã pick.

    - Xuất một bảng thống kê như bản vẽ thứ nhất của bạn gồm: tọa độ (X,Y) của các đỉnh; chiều dài các cạnh giữa 2 đỉnh kề nhau.

    Trước đây đã có một bạn nhờ mình làm việc này (tại đây, bài số 14) nhưng bạn ấy diễn đạt khiến mình không thể hiểu. giờ nhìn vào bản vẽ thứ nhất của bạn nên mình lờ mờ đoán ra. ko biết có fải ý của bạn không.

    • Like 1

  16. Đây là lisp em đã viết lại theo gợi ý của anh Tuệ

    Lisp sẽ đưa ra yêu cầu

    - nhập số muốn nhân. (nếu không có thì enter bỏ qua)

    - nhập số muốn chia. (nếu không có thì enter bỏ qua. em tách số muốn nhân và số muốn chia thành 2 số độc lập để đỡ fải nhẩm giá trị nghịch đảo của một số nào đó khi thực muốn hiện phép chia)

    - nhập số muốn cộng (nếu không có thì enter bỏ qua. nếu muốn thực hiện phép trừ thay cho phép cộng thì chỉ cần nhập giá trị âm)

    - chọn các text số cần thay đổi giá trị. --> OK

    (defun c:tinh()
    (setq i 0 nhan 1 chia 1 cong 0)
    (setq 	nhan1 (getreal "\nnhap so muon nhan: ")
    chia1 (getreal "\nnhap so muon chia: ")
    cong1 (getreal "\nnhap so muon cong them: "))
    (if nhan1 (setq nhan nhan1))
    (if chia1 (setq chia chia1))
    (if cong1 (setq cong cong1))
    (prompt "\nchon cac so can sua ...")
    (setq txt (ssget '((0 . "TEXT"))))
    	(repeat (sslength txt)
    	(setq txt_name (ssname txt i))
    	  (setq txt_ent (entget txt_name))
    	(setq cont1 (cdr(assoc 1 txt_ent)))
    	(setq cont (atof cont1))
    	(if (and (/= cont1 "0") (/= cont1 "0.0") (/= cont1 "0.00") (/= cont1 "0.000") (/= cont1 "0.0000") (/= cont1 "0.0000")  (/= cont1 "00.0") (/= cont1 "00.00") (/= cont1 "00.000") (/= cont1 "00.0000") (/= cont1 "00.0000") (= cont 0)) ()
    	(progn
    	(setq s (+ (/ (* cont nhan) chia) cong))
    	(setq txt_ent  (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
    	(entmod txt_ent)))
    	(setq i (+ i 1))
    );repeat
    );defun

    Quả thật sau khi hoàn thiện lisp này mới thấy ý tưởng của anh Tuệ rất hay, rất thông minh. cảm ơn anh đã góp ý để em hoàn thiện code này. :s_big:

     

    Đoạn code này em có bổ xung thêm phần lọc đối tượng text là số và chuỗi ký tự. cách làm hơi củ chuối tý nhưng em nghĩ nó hoạt động tương đối hiệu quả rồi. hiện tại em cũng chưa nghĩ ra cách nào tốt hơn giúp lọc đối tượng text thành số và chuỗi ký tự riêng biệt.

    cách làm này có nhược điểm:

    - bị giới hạn nhận diện các số có giá trị bằng 0 (ngoài các số có giá trị là 0 đã đưa vào lisp như trên thì các số 0 dạng khác nó sẽ hiểu thành chuỗi ký tự. VD số 0.0 thì nó nhận diện được, còn số 000.00000 nó hiểu là chuỗi ký tự "000.00000" và ko thực hiện phép tính cho số này)

    - còn bị nhầm lẫn một chỗi ký tự thành một số nếu các kỹ tự đầu chuỗi là số. VD chỗi 23ABCD thì nó sẽ hiểu thành 23.

    tuy nhiên những trường hợp trên là rất ít gặp và có thể khắc phục trong qúa trình sử dụng. Hi vọng anh Tuệ mọi người có cách khác hay hơn.

    • Vote tăng 4

  17. Chào hai bạn Tuệ và Thaistreetz lisp mà bạn Thaistreetz viết đúng như yêu cầu của tớ đấy hình như bạn Thaistreetz là dân giao thông nên rất hiểu sử lý vụ cốt cách, ý bạn Tuệ là cộng trừ nhân chia cùng một lúc thì đúng là phải dùng biểu thức toán học chắc phải phức tạp lắm.

    Uh, mình là dân giao thông.

    giải quyết một biểu thức toán học cũng không fải là vấn đề phức tạp lắm. bản thân cad đã cung cấp cho ta công cụ để giải quyết các biểu thức toán học là lệnh CAL. có thể nhúng lệnh này vào lisp khá đơn giản. Tuy nhiên mình nghĩ điều đó không cần thiết.

    Vấn đề có lẽ là do anh Tuệ và mọi người không hiểu đc ý của bạn từ bản vẽ bạn up lên. (như bản vẽ của bạn thì ai cũng có thể hiểu phần thứ 3 mới là kết quả cuối cùng bạn muốn). Bạn chú ý cho lần sau nhé. Người viết lisp không phải là bạn nên có thể không hiểu đc điều bạn muốn, vì thế khi yêu cầu phải rõ ràng, cụ thể, một nghĩa thì mọi người mới có thể giúp bạn được. cũng để tránh gây cảm giác bực mình cho người giúp bạn khi công sức bỏ ra đành vứt đi và fải viết lại lisp.

     

    EDIT: Ah, em hiểu ý của anh Tuệ rồi, để em thử xem thế nào :s_big:

    • Vote tăng 1

  18. Chào Thaistreet.

    Lisp của bạn chỉ thực hiện phép tính cộng, nhân chia rời rạc, chưa thể hiện được yêu cầu của bạn vqnhb đề ra là như trong file minh hoạ là thực hiện phép tính trên Text theo quy tắc : Nhân chia trước, cộng trừ sau.

    Mình thấy bạn cũng biết về Lisp -> bạn hãy suy nghĩ và xây dựng 1 code thực hiện phép tính trên Text theo quy tắc : Nhân chia trước, cộng trừ sau nhé.

    Chúc bạn xây dựng Code thành công.

    Chào anh Tuệ.

    Vì em cũng gặp trường hợp của bạn vqnhb khá nhiều lần nên em hiểu chính xác điều bạn vqnhb muốn là gì qua bản vẽ của bạn ấy (có lẽ khác với cách mà mọi người sẽ hiểu). Và lisp trên đã thỏa mãn được nhu cầu sử dụng của vqnhb.

    Còn về ý tưởng của anh em chưa rõ ý anh lắm. Nếu ta thực hiện phép tính trên theo quy tắc: Nhân chia trước, cộng trừ sau. Vậy thì số liệu chúng ta nhập vào là gì? có phải một biểu thức toán học đơn giản với 4 phép tính không ạ?


  19. Ý mình là dùng một lisp để chuyển ra kết quả cuối cùng nhưng ở dòng Command: lisp có hỏi là có đổi cao độ hay không tức là +,-,*,/ vào một số x nào đấy vì có lúc công trình chỉ dùng cao độ giả định, nhưng có công trình lại đỏi hỏi cao độ quốc gia. thanks lời chúc của bạn

    Mình đã nhiều lần gặp trường hợp như bạn trong công việc. đây là lisp mình tìm được trên diễn đàn này. mình đã sửa lại 1 chút để bạn có thể sử dụng được cả 4 phép tính. Nó có tác dụng cộng, hoặc trừ, hoặc nhân, hoặc chia tất cả các text số mà bạn chọn với một số mà bạn nhập vào.

    lệnh là: cong; tru; nhan; chia.

    (defun c:cong()
    (setq i 0 s1 0)
    (setq n (getreal "\nnhap so muon cong them: "))
     (prompt "\nchon cac so can sua ...")
    (setq txt (ssget '((0 . "TEXT"))))
    	(repeat (sslength txt)
    	(setq txt_name (ssname txt i))
      	(setq txt_ent (entget txt_name))
    	(setq cont (cdr(assoc 1 txt_ent)))
    	(setq cont (atof cont))
    	(setq s (+ cont n))	  
      (setq txt_ent  (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
    	(entmod txt_ent)
    	(setq i (+ i 1))
    );repeat
    );defun	
    ;------------------------------------------------------
    (defun c:tru()
    (setq i 0 s1 0)
    (setq n (getreal "\nnhap so tru: "))
     (prompt "\nchon cac so can sua ...")
    (setq txt (ssget '((0 . "TEXT"))))
    	(repeat (sslength txt)
    	(setq txt_name (ssname txt i))
      	(setq txt_ent (entget txt_name))
    	(setq cont (cdr(assoc 1 txt_ent)))
    	(setq cont (atof cont))
    	(setq s (- cont n))	  
      (setq txt_ent  (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
    	(entmod txt_ent)
    	(setq i (+ i 1))
    );repeat
    );defun	
    ;------------------------------------------------------
    (defun c:nhan()
    (setq i 0 s1 0)
    (setq n (getreal "\nnhap so muon nhan: "))
     (prompt "\nchon cac so can sua ...")
    (setq txt (ssget '((0 . "TEXT"))))
    	(repeat (sslength txt)
    	(setq txt_name (ssname txt i))
      	(setq txt_ent (entget txt_name))
    	(setq cont (cdr(assoc 1 txt_ent)))
    	(setq cont (atof cont))
    	(setq s (* cont n))	  
      (setq txt_ent  (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
    	(entmod txt_ent)
    	(setq i (+ i 1))
    );repeat
    );defun	
    ;------------------------------------------------------
    (defun c:chia()
    (setq i 0 s1 0)
    (setq n (getreal "\nnhap mau so: "))
     (prompt "\nchon cac so can sua ...")
    (setq txt (ssget '((0 . "TEXT"))))
    	(repeat (sslength txt)
    	(setq txt_name (ssname txt i))
      	(setq txt_ent (entget txt_name))
    	(setq cont (cdr(assoc 1 txt_ent)))
    	(setq cont (atof cont))
    	(setq s (/ cont n))	  
      (setq txt_ent  (subst (cons 1 (rtos s)) (assoc 1 txt_ent) txt_ent))
    	(entmod txt_ent)
    	(setq i (+ i 1))
    );repeat
    );defun	
    ;------------------------------------------------------
    

    Chú ý là kết quả tính toán sẽ lấy số chữ số sau dấu phẩy theo Precision trong định dạng Units bản vẽ của bạn. Với text cao độ thường lấy 2 chữ số sau dấu phẩy. bạn nên thiết lập lại Precision trước khi chạy thực hiện lệnh.

    • Vote tăng 2

  20. Hề hề, chào bác Conghoan1003,

    Bác theo đuổi cái thằng líp này cũng kha khá thời gian rồi nhỉ. Với sự giúp sức của các bác Thiep, Tue_NV, hy vọng bác sẽ có thể tự giải quyết được cái yêu cầu bác đặt ra. Thực tế trong công việc của bác dùng lisp khá nhiều, bác hãy mạnh dạn làm thử vài cái là sẽ quen dần thôi. Lisp cũng không quá khó khăn đâu đối với những người đã có nền kiến thức tốt như bác. Khi bác co thể tự làm được những thằng lisp nho nhỏ này, bác sẽ thấy yêu đời hơn khá nhiều và cũng sẽ đỡ bị phụ huộc hơn trong công việc bác ạ.

    Theo yêu cầu của bác thì cái phần đánh số thứ tự điểm theo trật tự bác Tue_NV đã bày rồi, còn phần xuất ra file đã có cái lisp của bác Thiep, bây giờ bác chỉ phải ghép chúng lại với nhau và thay đổi chút xíu trong cái nội dung xuất ra cho phù hợp với yêu cầu của bác thôi mà. Hãy thử xem bác nhé. Rất mong bác thành công.

    Nếu trong quá trình bác chơi thử, có chỗ nào trục trặc thì bác cứ tống nó lên diễn đàn, mọi ngưòi sẽ gỡ giúp bác ngay bác ạ.

    Chào bác, mong bác chơi thiệt hay mọi nhẽ.

     

    Em thấy Bác phamthanhbinh nói đúng đó. Biết một chút về lisp sẽ rất chủ động trong công việc. Autolisp cũng là ngôn ngữ tương đối đơn giản, trực quan và dễ học. Bác Conghoan1003 cứ thử xem, thành công rồi có thể bác sẽ nghiện luôn đó :s_big:

    • Vote tăng 2

  21. Sax! Việc này cũng fải viện đến lisp sao?

    - tạo 1 textstyle dùng font .vnarial

    - Chọn tất cả các text có trong bản vẽ (Dùng hộp thoại properties, hoặc filter hoặc qick select)

    - Chuyển các text được chọn về style vừa tạo.

    Xong.

    nếu muốn xóa các style cũ không còn nữa thì purge 1 phát. bản vẽ chỉ còn đúng duy nhất một textstyle dùng font .vnarial

    • Vote tăng 1

  22. Xin chào các bạn.

    Topic này cũng lâu rồi, và sau 1 thời gian dùng lisp này mình xin cám ơn các bạn trên cadviet.com đã tạo ra lisp này. Bản thân mình sau khi dùng nhiều lần, thấy lisp này còn thiếu 1 chức năng là nhớ lại hệ số scale mình vừa sử dụng trước đó. Chức năng này tương tự lệnh scale trong CAD. Mình thấy chức năng này cũng cần thiết, đỡ phải đánh lại nhiều lần cùng 1 hệ số scale. Rất mong các anh chị em biết lisp có thể edit lại.

    Xin cám ơn mọi người!

    Bạn thay dòng: (setq hs (getreal "\nCho biet he so scale: "))

     

    Bằng đoạn sau:

     

    (if (not hs)

    (setq hs1 (getreal (strcat "\n Nhap he so scale: ")))

    (setq hs1 (getreal (strcat "\n He so scale < " (rtos hs 2 5) " >: "))))

    (if hs1 (setq hs hs1))

    • Vote tăng 1

  23. Vẩn sử dụng với mục đích copy MỘT đối tượng rồi align với TỪNG (nhiều) đối tượng khác.

    Thay vì phải chọn từng point do lệnh Align yêu cầu, xin Bác Tue_NV viết LISP cho phép chọn LINE trên đối tượng copy (tức là chọn được 2 điểm endpoints) rồi align vào CÁC đối tượng khác cũng bằng cách chọn các LINE trên các đối tượng cần Align.

    Như vậy sẽ giảm rất nhiều lần phải Specify... point.

    Thank you Bác nhé.

     

    Nếu pick như vậy, làm cách nào bạn kiểm soát được đâu là điểm đầu (start point), đâu là điểm cuối (end point) của các đường line. vì nó ảnh hưởng trực tiếp đến góc quay và vị trí của đối tượng sau khi align.

    thai2.jpg

    bạn cứ thực hiện lệnh align sẽ hiểu.

    Mình nghĩ công việc này không lười được.


  24. Em chào các anh. em muốn hỏi khi viêt lisp muốn chon điểm là điểm gốc của đối tượng dtext thì phải dùng hàm như thế nào?

     

    Không biết điểm gốc của đối tượng dtext theo ý bạn là điểm nào trong 2 điểm sau:

    - điểm bắt đầu của đối tượng Dtext, nó nằm ở góc dưới bên trái mỗi đối tượng dtext. Điểm này có mã DXF là 10

    - điểm Justify của đối tượng Dtext, nó nằm ở một trong các vị trí: Left, center, right, top left, top center ... của text. Điểm này có mã DXF là 11.

     

    Mình lấy ví dụ cho trường hợp 1 nhé. trường hợp 2 cũng tương tự.

    (setq DT (entsel "\nChon text"))

    (setq Pt (cdr(assoc 10 (entget(car DT)))))

     

    @vqhnb: Lisp bạn cần mình nhớ ở diễn đàn đã có. bạn PHẢI TÌM KIẾM TRƯỚC khi post yêu cầu nhé (dùng hộp thoại tìm kiếm). nếu vì một lý do nào đó lisp đã có trên diễn đàn chưa phù hợp với nhu cầu của bạn thì hãy post yêu cầu đê mọi người sửa giúp bạn.

    • Vote tăng 2
×