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

Viết Lisp theo yêu cầu

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

Hôm nay em có viết hộ 1 lisp cho một người bạn, cậu ta yêu cầu sử dụng Unicode đối với các text mà lisp vẽ ra màn hình. Và em phát hiện ra là lisp hình như không hỗ trợ nhận dạng bảng mã Unicode. Em viết bằng notepad và đã save as với Encoding là UTF-8. Lisp chạy được nhưng hoàn toàn không nhận diện đc các ký tự tiếng việt của bảng mã Unicode.

 

Như vậy nếu ta có xây dựng được danh sách mã nguồn (Bảng mã Unicode) và mã đích (bảng mã VNI) thì lisp cũng chỉ nhận diện được mã đích nên có lẽ sẽ không thể dùng được cách mà lisp chuyển từ TCVN3 sang VNI đã làm.

taị vì khi bạn thay đổi mã nguồn thì bạn phải thay đổi cả font của nó thì nó với hiểu được chứ...

Tái bút: bạn có thể tham khảo chương trình này của Tomboy viết nhằm chuyển mã TCVN3 sang VNI nhé, còn chuyển từ mã này qua mã kia và ngược lại thì cũng trên nguyên tắc này thôi, nhưng tại vì mình bận quá nên chưa viết được, rất mong sự cộng tác của bạn hoàn thành nốt đoạn chương trình này để anh em diễn đàn được nhờ. Thanks

linh nè: http://www.cadviet.com/upfiles/2/chm.rar

note: mình mới chỉ viết chuyển mã cho TEXT chứ MTEXT thì chưa làm vì vậy nhờ Thaistreetz hoàn thành nốt 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
tôi chạy thử lisp của bạn thì nó hiện như sau:

Command: _appload jd.lsp successfully loaded.

Command:

Command:

Command: jd

Undo Enter the number of operations to undo or

[Auto/Control/BEgin/End/Mark/Back] <1>: group

Command:

Select objects: Specify opposite corner: 104 found

Select objects:

Undo Enter the number of operations to undo or

[Auto/Control/BEgin/End/Mark/Back] <1>: end

Command: nil

Command:

chọn đối tượng xong là nó ko thực hiện gì hết...

đây la file mẩu của mình :

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

xin giúp đở.....thank

do số liệu của bạn không đúng, bạn xem lại bản vẽ này nhé: http://www.cadviet.com/upfiles/2/tra_loi_ban_kamezoko.dwg

  • 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
Xin lisp sắp xếp text theo chiều ngang:

Trước khi thực hiện lệnh

http://www.cadviet.com/upfiles/2/truoc_1.jpg

Sau khi thực hiện lệnh

http://www.cadviet.com/upfiles/2/sau_2.jpg

Xin cảm ơn mọi người rât nhiều.

mình thấy 2 file của bạn giống hệt nhau, nên mình chẳng hiểu gì hết. bạn có thể post lại và giải thích rõ hơn nhé (nhớ gửi bản vẽ chứ đừng gửi ả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
do số liệu của bạn không đúng, bạn xem lại bản vẽ này nhé: http://www.cadviet.com/upfiles/2/tra_loi_ban_kamezoko.dwg

@tomboy, @kamezoko

Tomboy đưa ra lisp JD tuy thiep chưa chạy thử, nhưng Thiep hiểu là Tomboy muốn joint các ký tự trong text sao cho dấu chấm thập phân trùng với điểm đo chi tiết trong trắc địa.

Còn lisp JD của bác Hoanh là để tạo line nối các điểm đo chi tiết sao cho nó có cùng kiểu seri Code.

Làm sao mà giống nhau được?!! Tomboy nói ai đó đã táy máy sửa lại lisp JD của bác Hoanh có nghĩa ai đó đã biết được pass của bác Hoành (ngoại trừ bác Hoành đã táy máy làm điều này)!!! Lần sau nhớ nói cho đúng bạn ạ.

Kamezoko chỉ cần sửa lại đoạn này không có các khoảng trống giữa "< OR" hay "< AND"

Có lẻ bị lỗi khi đưa lisp vào CODEBOX, nó tự động tách ra thôi.

  • 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
taị vì khi bạn thay đổi mã nguồn thì bạn phải thay đổi cả font của nó thì nó với hiểu được chứ...

Tái bút: bạn có thể tham khảo chương trình này của Tomboy viết nhằm chuyển mã TCVN3 sang VNI nhé, còn chuyển từ mã này qua mã kia và ngược lại thì cũng trên nguyên tắc này thôi, nhưng tại vì mình bận quá nên chưa viết được, rất mong sự cộng tác của bạn hoàn thành nốt đoạn chương trình này để anh em diễn đàn được nhờ. Thanks

linh nè: http://www.cadviet.com/upfiles/2/chm.rar

note: mình mới chỉ viết chuyển mã cho TEXT chứ MTEXT thì chưa làm vì vậy nhờ Thaistreetz hoàn thành nốt nhé

 

Tất nhiên là mình đã chạy lisp với các font unicode rồi. Mình ví dụ đơn giản với code này nhé

(defun c:TT ()

(setq PT (getpoint "\nChon diem chen text:"))

(command "TEXT" pt 2 0 "Chào mừng bạn đến với Cad việt")

)

Mình dùng cad 2008, chạy với textstyle dùng 1 trong 3 font: time new roman, aria và tahoma là 3 font thuộc bảng mã Unicode.

kết quả ghi ra màn hình của mình được thế này: Chào mừng bạn đến vá»›i Cad việt

 

Công việc của mình cũng hơi bận chút vì fải đá thêm ngoài nữa, cuối tuần rảnh hơn mình sẽ nghiên cứu code của bạn sau vậy.

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
@tomboy, @kamezoko

Tomboy đưa ra lisp JD tuy thiep chưa chạy thử, nhưng Thiep hiểu là Tomboy muốn joint các ký tự trong text sao cho dấu chấm thập phân trùng với điểm đo chi tiết trong trắc địa.

Còn lisp JD của bác Hoanh là để tạo line nối các điểm đo chi tiết sao cho nó có cùng kiểu seri Code.

Làm sao mà giống nhau được?!! Tomboy nói ai đó đã táy máy sửa lại lisp JD của bác Hoanh có nghĩa ai đó đã biết được pass của bác Hoành (ngoại trừ bác Hoành đã táy máy làm điều này)!!! Lần sau nhớ nói cho đúng bạn ạ.

Kamezoko chỉ cần sửa lại đoạn này không có các khoảng trống giữa "< OR" hay "< AND"

Có lẻ bị lỗi khi đưa lisp vào CODEBOX, nó tự động tách ra thôi.

tại vì mình nghĩ trong chương trình của bác Hoành mục đích chính là nối text TEN DIEM với text CODE để tạo thành 1 text duy nhất, (và đoạn này mình nghĩ đã bị ai xoá đi mất tiêu, còn đoạn nối TEN DIEM với CODE có tên trùng với TEN DIEM chỉ là để thông báo cho người dùng biết. Chính vì thế mà mình với thay đổi Lisp của bác ấy. Vả lại mình cũng nói với bác ấy nếu mình có thay đổi công năng chương trình của bác thì bác cứ góp ý phê bình mà. Dẫu sao thì mình cũng cảm ơn sự góp ý của bạn, còn chuyện biết Pass với sửa được thì bạn hoàn toàn hiểu sai ý của mình, chẳng lẽ đoạn lisp nào post lên mạng đều phải biết pass mới sửa được hay sao?

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
@tomboy, @kamezoko

Tomboy đưa ra lisp JD tuy thiep chưa chạy thử, nhưng Thiep hiểu là Tomboy muốn joint các ký tự trong text sao cho dấu chấm thập phân trùng với điểm đo chi tiết trong trắc địa.

Còn lisp JD của bác Hoanh là để tạo line nối các điểm đo chi tiết sao cho nó có cùng kiểu seri Code.

Làm sao mà giống nhau được?!! Tomboy nói ai đó đã táy máy sửa lại lisp JD của bác Hoanh có nghĩa ai đó đã biết được pass của bác Hoành (ngoại trừ bác Hoành đã táy máy làm điều này)!!! Lần sau nhớ nói cho đúng bạn ạ.

Kamezoko chỉ cần sửa lại đoạn này không có các khoảng trống giữa "< OR" hay "< AND"

Có lẻ bị lỗi khi đưa lisp vào CODEBOX, nó tự động tách ra thôi.

tôi đã sửa lại nhưng nó ko thực hiện nối line..??load thì thành công,chọn đối tượng xong thì nó ko làm việc tiếp...hic :s_big:

cám ơn tomboy nhiều ,lisp của bạn ko giống ý tôi nhưng cũng là lisp hay (^;^)

có ai giúp mình ko????huhu

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
Xin lisp sắp xếp text theo chiều ngang:

Mình xin trình bày rõ yêu cầu trong bản vẽ sau

Mong mọi người giúp đỡ.

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

Bạn sử dụng Code này thử nhé :

(defun c:sxt()
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget '((0 . "TEXT,MTEXT"))))
(command "justifytext" ss "" "BC")

(setq lst (ss2ent ss)
lst (vl-sort lst
'(lambda (e1 e2)
((cadr (assoc 10 (entget e1)))
(cadr (assoc 10 (entget e2)))
)
)
)
)

(setq ddau (cdr(assoc 10 (entget(car lst))))
i 0)

(foreach e lst
(setq ent (entget e))
(setq dcuoi (cdr(assoc 10 ent)))
(setq ddauu (list (car dcuoi) (cadr ddau) 0))
(command "move" e "" dcuoi ddauu) 
(setq i (1+ i))
)
(setvar "osmode" oldos)
(Princ)
)
;
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (if ss (sslength ss) 0)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)

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

Nhờ các bác cao thủ viết giúp em LISP có yêu cầu như thế này:

1.Khi thực hiện lệnh, ta có thể vẽ đồng thời 2 đường line hay 2 đường polyline, hoặc arc...với khoảng cách của 2 đường và màu sắc có thể thay đổi do người dùng.VD: khi vẽ, tạo ra đồng thời 2 đường line, line 1 màu số 4, line 2 màu số 8

2.Lisp thứ 2 là khi thực hiện ta có thể chon các đối tượng cùng màu để đưa vào 1 lớp.

Thank các bác cao thủ 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

các bác viết giúp em lisp như này nhé: trên bản vẽ có rất nhiều text là các số với nhiều giá trị khác nhau. Em cần lọc ra tất cả các số có giá trị lớn hơn( hoặc có cả lựa chọn : nhỏ hơn_do người dùng chọn lựa khi dùng lệnh) 1 giá trị cố định nào đó bằng cách nhập giá trị này vào khi dùng lệnh. ví dụ: em cần tìm tất cả các số lớn hơn 5.00, số 5 là do mình nhập vào.sau khi dùng lệnh xong bản vẽ sẽ hiển thị tất cả các giá trị vừa lọc được. thanks hiu các bác nhìu trước! :s_big: em đ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
các bác viết giúp em lisp như này nhé: trên bản vẽ có rất nhiều text là các số với nhiều giá trị khác nhau. Em cần lọc ra tất cả các số có giá trị lớn hơn( hoặc có cả lựa chọn : nhỏ hơn_do người dùng chọn lựa khi dùng lệnh) 1 giá trị cố định nào đó bằng cách nhập giá trị này vào khi dùng lệnh. ví dụ: em cần tìm tất cả các số lớn hơn 5.00, số 5 là do mình nhập vào.sau khi dùng lệnh xong bản vẽ sẽ hiển thị tất cả các giá trị vừa lọc được. thanks hiu các bác nhìu trước! :s_big: em đang rất cần......

Bạn sử dụng cái này thử xem :

(defun c:Loctext(/ ss i ent content so ans snho slon)
(setq ss (ssget '((0 . "TEXT"))) snho (ssadd) slon (ssadd))
(setq i 0 s1 0 s2 0)
(initget "L N") 
(setq ans (getstring "\n chon so Nho hon N  , Chon so Lon hon L :  : "))

(if (or (= ans "n") (= ans "N"))
(progn  
(setq so (getreal "\n Nhap so nho hon : "))

(while ((setq ent (ssname ss i))
(if (and (setq content (distof(cdr(assoc 1 (entget ent))))) ((setq snho (ssadd ent snho))
)
(setq i (1+ i))
);while
(sssetfirst snho snho)
);progn
);if
(setq i 0)
(if (or (= ans "L") (= ans "l"))
(progn  
(setq so (getreal "\n Nhap so lon hon : "))

(while ((setq ent (ssname ss i))
(if (and (setq content (distof(cdr(assoc 1 (entget ent))))) (> content so))
(setq slon (ssadd ent slon))
)
(setq i (1+ i))
);while
(sssetfirst slon slon)
);progn
);if

(princ)
)

:cheers:

  • 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
Bạn sử dụng Code này thử nhé :

(defun c:sxt()
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget '((0 . "TEXT,MTEXT"))))
(command "justifytext" ss "" "BC")

(setq lst (ss2ent ss)
lst (vl-sort lst
'(lambda (e1 e2)
(<
(cadr (assoc 10 (entget e1)))
(cadr (assoc 10 (entget e2)))
)
)
)
)

(setq ddau (cdr(assoc 10 (entget(car lst))))
i 0)

(foreach e lst
(setq ent (entget e))
(setq dcuoi (cdr(assoc 10 ent)))
(setq ddauu (list (car dcuoi) (cadr ddau) 0))
(command "move" e "" dcuoi ddauu) 
(setq i (1+ i))
)
(setvar "osmode" oldos)
(Princ)
)
;
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (if ss (sslength ss) 0)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)

Thật sự là tuyêt vời.Cảm ơ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
Nhờ các bác cao thủ viết giúp em LISP có yêu cầu như thế này:

1.Khi thực hiện lệnh, ta có thể vẽ đồng thời 2 đường line hay 2 đường polyline, hoặc arc...với khoảng cách của 2 đường và màu sắc có thể thay đổi do người dùng.VD: khi vẽ, tạo ra đồng thời 2 đường line, line 1 màu số 4, line 2 màu số 8

2.Lisp thứ 2 là khi thực hiện ta có thể chon các đối tượng cùng màu để đưa vào 1 lớp.

Thank các bác cao thủ nhiều...

 

- Lisp 1: Đề thiếu: Khoảng cách giữa 2 đường bằng bao nhiêu? điểm pick để vẽ nằm ở vị trí nào: giữa 2 đường hay thuộc 1 trong 2 đường.

Mà mình nhớ không nhầm thì cad cũng đã có lệnh vẽ các đường song song với nhau. tuy nhiên mình không nhớ lệnh. Với lại việc này có thể vẽ bình thường rồi offset cũng đâu có mất thời gian mấy đâu bạn?

- Lisp 2: bạn có thể dụng lệnh qick select hay lệnh filter.

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
Mà mình nhớ không nhầm thì cad cũng đã có lệnh vẽ các đường song song với nhau. tuy nhiên mình không nhớ lệnh.

- Lisp 2: bạn có thể dụng lệnh qick select hay lệnh filter.

@ Thaistreetz

1. Lệnh Miline

2. lệnh quick select hay lệnh filter : Có thể chọn đối tượng có màu là Bylayer. Nhưng không phân biệt được màu, cái nào là màu xanh, cái nào là màu vàng ......

  • 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
@ Thaistreetz

1. Lệnh Miline

2. lệnh quick select hay lệnh filter : Có thể chọn đối tượng có màu là Bylayer. Nhưng không phân biệt được màu, cái nào là màu xanh, cái nào là màu vàng ......

 

Có lựa chọn theo màu được mà anh. trong hộp thoai filter mình chọn đối tượng là Color, bên cạnh có nút Select, bấm vào đó để chọn màu. Ví dụ với màu đỏ thì ta sẽ có Object selection là: Color = 1-red

Edit: Ah em nhầm. Nếu layer có màu trùng với màu đc chọn thì sẽ không nhận diện đc.

Có lần anh Duy viết hộ em cái lisp xóa đói tượng theo màu cũng gặp fải vấn đề này. bg em mới nhớ :s_big:

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
Có lựa chọn theo màu được mà anh. trong hộp thoai filter mình chọn đối tượng là Color, bên cạnh có nút Select, bấm vào đó để chọn màu. Ví dụ với màu đỏ thì ta sẽ có Object selection là: Color = 1-red

Edit: Ah em nhầm. Nếu layer có màu trùng với màu đc chọn thì sẽ không nhận diện đc.

Có lần anh Duy viết hộ em cái lisp xóa đói tượng theo màu cũng gặp fải vấn đề này. bg em mới nhớ :s_big:

Mình nhớ là cải thiện được việc này rồi mà! Cái đoạn đó thì Tue_NV cũng biết rồi đấy thôi.

  • 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

Bạn Tue_NV ơi bạn có thể viết giúp mình lisp chuyển đường 2d poline thành đường 3d poline không. Mục đích là mình làm đường đứt gẫy khi san nề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
Bạn Thaistreetz giúp tớ được không? trong cột thống kê toạ độ điểm nút có thêm cột ghi chú.

http://www.cadviet.com/upfiles/2/lay_toa_do.lsp

Giúp thì tớ giúp đc thôi, nhưng bạn post bài lần đầu tiên đã sai chỗ nên tớ cũng nhờ bạn giúp lại tớ là đọc lại hộ tớ 1 lượt nội quy của diễn đàn cũng như nội quy của box này. những gì cần nói tớ cũng đã viết trong tin nhắn cho bạn. fiền bạn trả lời tớ bằng tin nhắn theo nick này để tránh làm ảnh hưởng đến nội dung topic này 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
Mình nhớ là cải thiện được việc này rồi mà! Cái đoạn đó thì Tue_NV cũng biết rồi đấy thôi.

Chào anh Duy. Đoạn Code mà anh Duy cải thiện nó nằm ngay ở đây :

http://www.cadviet.com/forum/index.php?showtopic=7493

và bạn Thaistreetz đã tick thanks cho anh Duy. bạn Thaistreetz có biết về nó. Và bài viết trên của Tue_NV là để trả lời cho bài viết của bạn Thaistreetz

- Lisp 2: bạn có thể dụng lệnh qick select hay lệnh filter

 

sử dụng lệnh quick select hay lệnh filter : Có thể chọn đối tượng có màu là Bylayer. Nhưng không phân biệt được màu, cái nào là màu xanh, cái nào là màu vàng ......

+> Tức ý của Tue_NV muốn nói : không thể sử dụng lệnh quick select hay lệnh filter để phân biệt các đối tượng có màu là ByLayer, cái nào màu xanh, cái nào màu vàng...... và chỉ có thể dùng Lisp

 

@Tuynh : Mọi người không ngại giúp bạn. Chỉ cần bạn post bài với nội dung đúng chủ đề thì sẽ có người giúp bạn.

Bạn Tue_NV ơi bạn có thể viết giúp mình lisp chuyển đường 2d poline thành đường 3d poline không. Mục đích là mình làm đường đứt gẫy khi san nền

Bạn có thể upload file lên đây và nói rõ hơn được không?

Chào bạn. Chúc vui

  • 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
load thì đươc nhưng nó ko chạy gi hết...mình ko biết tại sao lại như vậy...bạn nào biết chỉ dùm..cám ơn :s_big:

Để lisp hoạt động được , yêu cầu các point phải ở trên layer có tên là DIEM, tương tự tên điểm thuộc layer TENDIEM, mã điểm thuộc layer CODE

  • 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
các bác viết giúp em lisp như này nhé: trên bản vẽ có rất nhiều text là các số với nhiều giá trị khác nhau. Em cần lọc ra tất cả các số có giá trị lớn hơn( hoặc có cả lựa chọn : nhỏ hơn_do người dùng chọn lựa khi dùng lệnh) 1 giá trị cố định nào đó bằng cách nhập giá trị này vào khi dùng lệnh. ví dụ: em cần tìm tất cả các số lớn hơn 5.00, số 5 là do mình nhập vào.sau khi dùng lệnh xong bản vẽ sẽ hiển thị tất cả các giá trị vừa lọc được. thanks hiu các bác nhìu trước! :s_big: em đang rất cần......

bạn xài thử cái này: http://www.cadviet.com/upfiles/2/loc.lsp

lệnh là: LOC

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

Mình đưa file lên đây

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

đường 2d poline có cao độ là 10, đường 3d poline có cao độ khác nhau tại các điểm point, bạn có lisp nào mà khi pick vào đường

2d poline thì tại các điểm point hiện cao độ cho mình nhập theo ý muốn và đường 2d poline chuyển thành 3d poline.

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

Nhờ các bạn viết giùm mình đoạn lisp gọi bảng DIMENSION STYLE MANAGER vì mình không muốn vào chỉnh trong acad.pgp vì mỗi lần cài lại cad phải chỉnh lại mất công lắm.Chân thành cảm ơn trước.

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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×