PDA

View Full Version : Visual Lisp?


PTC-KVD
05-11-2004, 08:50 AM
Mọi người không thấy ai trao đổi về VLISP đây là phần lập trình rất hay mà nếu sử dụng tốt sẽ rất có lợi cho công tác thiết kế. Nhất là từ AutoCAD phiên bản 2000 đã có hỗ trợ giao diện lập trình và đầy đủ các công cụ debug rất thuận lợi cho việc lập trình để tự động hóa thiết kế.

hoahuce
05-11-2004, 08:18 PM
hiện nay em chưa thấy có bản lisp nào có tầm tổng quát cả, chỉ là những lệch cơ bản, kết hơp với nhau để sử dụng thuận tiện hơn.

PTC-KVD
05-11-2004, 10:28 PM
Ko hiểu tầm tổng quát của bạn là như thế nào theo tôi lisp là ngôn ngữ lập trình đầy đủ như các ngôn ngữ bậc cao khác tất nhiên có hỗ trợ mạnh về đồ họa. Có khác chỉ là nếu lập trình bằng lisp thì chỉ chạy được trên nền autocad dù có compile rồi. Ngoài ngôn ngữ lisp còn một phần nữa tôi cho là rất hay là ObjectARx mọi người cùng chia sẻ hiểu biết của mình nhé

dontnod
10-11-2004, 10:22 PM
Mình cũng chưa hiểu HoaHUCE nói bản Lisp có tầm tổng quát là như thế nào. Có phải ý bạn nói là chưa có ứng dụng nào lớn được viết bằng AutoLisp đúng không. Điều này thì quả là đúng, vì cho dù AutoLisp (và sau này là Visual Lisp) là một ngôn ngữ lập trình bậc cao, nhưng nó lại là một ngôn ngữ lập trình thủ tục (procedural), hơn thế nó lại là ngôn ngữ thông dịch (interpreted) chứ không phải là biên dịch (compiled). Chính vì thế khi viết các ứng dụng lớn trong môi trường AutoCAD người ta thường dùng các ngôn ngữ lập trình hướng đối tượng (object oriented) và có thể biên dịch (compile) vì như vậy sẽ dễ dàng hơn và có tốc độ giải quyết bài toán nhanh hơn.

CNPM
11-11-2004, 07:59 AM
Bạn dontnod rất đúng, nếu các bạn trao đổi với nhau ở mức độ chung chung thế này thì chẳng giải quyết được gì. Cách tốt nhất là bạn đưa ra một chủ đề hay một ví dụ nhỏ sau đó ta sẽ bàn về nó. Thế hay hơn nhiều !

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

123456789
21-11-2004, 06:25 PM
Cac bac nghi sao khi AutoCAD dang duoc Viet hoa ! voi su giup suc cua VLisp !

PMXD
21-11-2004, 10:53 PM
Việt hóa AutoCad?????
Theo tôi công việc này ko có ý nghĩa cao lắm về mặt sử dụng.Tại sao chúng ta cứ cho rằng việc tạo ra một phần mềm có giao diện tiếng Việt là sẽ giúp cho người sử dụng nhỉ. Tôi cũng đã từng dịch giao diện của Slope/W sang tiếng Việt nhưng thấy việc đó thật vô ích, có khi còn giảm ý nghĩa của từ gốc, gây ảnh hưởng đến một số người sử dụng do việc Việt hóa đó.
Trong giao diện các chương trình Windows thường có các Menu: File, Edit, View, Tools, Help...với các lệnh như Open, Close, Exit, Copy, Cut, Paste...Các từ này được những nhà lập trình nghiên cứu rất kỹ khi sử dụng bởi tính ngăn gọn, dễ hiểu. Khi chúng ta dịch chúng sang tiếng Việt thì cũng phải tìm những từ có nghĩa tương tự, cũng ngắn gọn, dễ hiểu, điều đó thật không dễ mà hiệu quả thì chưa biết thế nào.
Tôi xin lấy những ví dụ :
File => Tệp
Refesh => Làm tươi
Edit => Chỉnh
Windows => Cửa sổ
View => Nhìn
Tools => Công cụ
......
.....

Các bạn thử nhìn và so sánh xem khi đưa các từ tiếng Việt đó vào phần mềm thì sẽ thế nào???
Đó là chưa xét đén tình huống dùng VisualLisp rất khó can thiệp vào hệ thống của Windows để thay đổi Font của hệ thống sang font Tiếng Việt.
Theo tôi, nếu bạn sử dụng tốt VLisp thì bạn hãy viết những ứng dụng hỗ trợ trong công việc thiết kế xây dựng, điều đó sẽ hiệu quả hơn.
Trên đây là những điều tôi rút ra từ bài học của chính bản thân tôi, mong rằng không làm các bro hiểu lầm.

daobkba
14-12-2004, 01:50 PM
[QUOTE=PMXD]Việt hóa AutoCad?????
Hiện nay chưa post file list nào bởi đây là sản phẩm trí tuệ của dân xây dựng, cũng như phần mềm của dân IT. Theo tôi ai có thể lập trình lít tốt thì khả năng dùng các phần mềm lập trình khác như Delphi, Visual.. bời nếu có tư duy lập trình thì ngôn ngôn nào cũng như nhau quan trọng là thời gian tiếp xúc và ngiên cứu thêm. Tôi thấy các anh em trong Hài Hòa mà kính nể bởi họ có khả năng tin học rất cơ bản và đã làm nhiều sản phẩm như Nova, TKK, CE... mà tính năng trong các phần mềm này không phải là đơn giản. Các anh em cố gắng nghiên cứu. Còn các file list khi nào rảnh tôi sẽ post lên cho anh em không hơi đâu mà nghiên cứ.

daobkba
14-12-2004, 01:51 PM
[QUOTE=PMXD]Việt hóa AutoCad?????
Hiện nay chưa post file list nào bởi đây là sản phẩm trí tuệ của dân xây dựng, cũng như phần mềm của dân IT. Theo tôi ai có thể lập trình lít tốt thì khả năng dùng các phần mềm lập trình khác như Delphi, Visual.. bời nếu có tư duy lập trình thì ngôn ngôn nào cũng như nhau quan trọng là thời gian tiếp xúc và ngiên cứu thêm. Tôi thấy các anh em trong Hài Hòa mà kính nể bởi họ có khả năng tin học rất cơ bản và đã làm nhiều sản phẩm như Nova, TKK, CE... mà tính năng trong các phần mềm này không phải là đơn giản. Các anh em cố gắng nghiên cứu. Còn các file list khi nào rảnh tôi sẽ post lên cho anh em không hơi đâu mà nghiên cứu.

ducxd
15-12-2004, 11:54 AM
Nói vậy không biết đúng không , thật sự dân xây mình viết phần mềm theo kiểu lắp ghép theo một chuổi với nhau , chưa phần mềm nào có thể cho người dùng can thiệp vào để đưa ra kết quả cuối cùng hợp lý gọi nôm na là phần mềm tương tác. Chứ đâu khi nào chạy ra nội lực ta bê nguyên xi để tính đâu phải chỉnh sửa kết quả , nếu mấy anh CIC đầu tư cái này làm được thì hay quá.

Liberty
20-12-2004, 03:42 PM
Mọi người không thấy ai trao đổi về VLISP đây là phần lập trình rất hay mà nếu sử dụng tốt sẽ rất có lợi cho công tác thiết kế. Nhất là từ AutoCAD phiên bản 2000 đã có hỗ trợ giao diện lập trình và đầy đủ các công cụ debug rất thuận lợi cho việc lập trình để tự động hóa thiết kế.

Trước đây tôi cũng hay lọ mọ cái anh Autolisp này đấy nếu bạn quan tâm chúng ta cùng trao đôi nhé.
Tôi gửi kèm đây một mẩu ứng dụng nhỏ "tất nhiên là ứng dụng này ở các phiên bản sau của AUTOCAD đã có trong bonuos rồi" cái này "GLUE" có tác dụng nối hai dọan thẳng cho trước thành một.
chúc bạn tìm thấy nhiều niềm vui nho nhỏ khi sử dụng GLUE

nglam_adg
26-12-2004, 01:29 AM
Quả thực nói là phần mềm tổng quát thì theo tôi không làm được đâu - Cá nhân tôi đã thử rồi. AutoCAD tự bản thân nó đã rất tổng hợp. Tôi đã qua cái thời sử dụng AutoCAD 10 (trên nền Dos), máy tính khi đó không có đủ bộ đệm để chạy AutoCAD. mỗi lần chạy phải tạo Processor ảo thi mới "bò" được. Tôi đã muốn viết 1 phần mềm đầy đủ các ứng dụng và hầu hết những gì tôi định làm hoặc đã làm thì AutoCAD ngày nay đều có (tốt hơn của tôi rất nhiều). Tồi nghĩ chúng ta chỉ nên phát triển cái ta cần, thực dụng một chút để hỗ trợ công việc đang làm.
Tôi đã thử viết hầu hết những gì hàng ngày mình cũng như các anh em khác phải làm. Có thể những thứ đó không tổng quát nhưng nó làm giảm rất nhiều công sức khi làm việc.
Dưới đây là một vài ứng dụng: (thống kê thép, thư viện, vẽ điện....)

nglam_adg
26-12-2004, 07:54 PM
Các tiện ích trên có giao diện tương tác - Tức là người sử dụng có thể bổ xung, chỉnh sửa các thông số trực tiếp trên hộp thoại. Phần vẽ điện sẽ tự động thống kê thiết bị điện có trên bản vẽ. Phần thống kê thép có thể sửa bất kỳ bảng thống kê nào được tạo ra bởi chương trình (bằng cách pick chọn vào số hiệu thép, bảng thông số thép được chọn sẽ hiển thị để chỉnh sửa, thay đổi...). Phần thư viện dữ liệu, có thể bổ xung, thay đổi, xóa... dữ liệu vô tư.
Còn phần tra cửa chỉ dành cho những bác nào "duy tâm". Cửa tính theo thước Lỗ Ban (Ông tổ ngành mộc - Trung Quốc)

--------------------------------------------
Tôi thấy có bạn viết là "list", như vậy là không đúng đâu. nguyên văn là: LISt Processor - viết tắt là Lisp, tệp con thường dùng là AutoLisp
Đây là một dạng ngôn ngữ trí tuệ nhân tạo (Artificial Interligence), được phát triển từ XLISP - ngôn ngữ dùng riêng cho môi trường AutoCAD, có tác động tương đương lệnh chuẩn của AutoCAD.

taotao395
28-12-2004, 06:20 PM
:D Mạn phép anh em trình bày thử cách thống kê không dùng chương trình.
Tôi đã chinh chiến 7 năm trên lĩnh vực thợ vẽ, đã gặp một số loại lisp thống kê thép na ná kiểu các bác nói trên, nhưng không hợp. Chỉ cần dùng bảng excel thống kê, sau đó chèn sang CAD, dùng một lệnh căn lề chuyển các chữ từ bảng excel sang bảng thống kê có sẵn, cuối cùng vẽ lại các hình thép.
Nói vậy có vẻ dài và mất công. Nhưng cần thực dụng một chút.
- Việc gõ các cột fi, cdài 1 thanh, số lượng tương đương với việc các bác gõ trong chương trình, phần tổng cdài, trọng lượng excel tính
- Past Special sang CAD, chuyển số vào bảng thống kê có sẵn là hoàn toàn đơn giản.
- Việc vẽ lại các hình thép: không phức tạp và lâu như mọi người ngại. Bởi với một bảng thống kê có trước cùng loại thì chỉ việc copy sang, sửa vài số - xong. Ví dụ :
+ với thép sàn, loại thanh thép đa số chỉ có 2 loại thẳng và có móc, móc fi 8 là 60, fi 6 là 50 cố định không cần gõ lại;
+ với thép dầm : thép thẳng, có bẻ ke, đai - một công trình thường không có quá 5 loại dầm tức là chỉ có vài loại đai, đầu ke...
Quá đơn giản. Thống kê như vậy có tính kế thừa rất cao :D. Bảng excel có thể chỉnh sửa, chuyển cho dự toán :D Thao tác cộng trừ bằng excel nhanh hơn hẳn so với CAD :D
Với chương trình ví dụ ở trên, tôi thấy phải nhập rất nhiều số thì mới có 1 dòng thống kê mà nhiều khi các số đó trùng lặp liên tục.
Mẹo vặt: lâu nhất là bảng thống kê thép dầm. Khi vẽ dầm nên đánh số thép thống nhất: thép dưới là số 1, 1a, thép trên là 2, 2a, thép tăng cường gối có bẻ mỏ là số 4, không bẻ mỏ là số 5, đai là số 6... Như vậy khi chuyển sang dầm khác có tính kế thừa cũng như bảng thống kế rất dễ theo dõi.
Chào thân ái :D

taotao395
28-12-2004, 06:23 PM
Xin lỗi các đồng chí lập trình nhé :D
Làm excel quen thì sẽ quên ngay các chương trình của các đồng chí :D :D :D

Robinho
29-12-2004, 02:29 AM
Ông anh TaoTao395 này vừa lạc hậu lại nghiệp dư. Nếu ông anh vẫn còn dùng Excel để lập bảng thống kê thì chán lắm... :D
Quả thật ông anh nên đổi cách làm đi, xưa rồi.

But Chi
29-12-2004, 08:11 AM
Bác nglam_adg cho em xin cái AutoLISP đó đị Em thấy nó hay hơn cái TK của em đang dùng. Cám ơn bác nhé.

xdung
29-12-2004, 08:19 AM
Ông anh TaoTao395 này vừa lạc hậu lại nghiệp dư. Nếu ông anh vẫn còn dùng Excel để lập bảng thống kê thì chán lắm... :D
Quả thật ông anh nên đổi cách làm đi, xưa rồi.
Tôi lại thấy đó là 1 phương pháp hay , các bác thay vì lập trình trong Cad thì lập trình trong Excel. Khâu input sẽ thực hiện trong Excel làm xong xuất ra file text và import vào CAD dùng một hàm lập trình chuyển thành bảng thống kê. Như vậy ta có thể dùng bảng excel để làm dự toán, còn khâu nhập liệu thì môi trường excel dễ hơn trong CAD.

nglam_adg
29-12-2004, 04:48 PM
Bác nglam_adg cho em xin cái AutoLISP đó đị Em thấy nó hay hơn cái TK của em đang dùng. Cám ơn bác nhé.
------------
Bạn vào đây mà tải về, dùng vô tư, có gì không hợp lý cứa phản ánh để khắc phục.
http://www.ketcau.com/showthread.php?t=415
(nó nằm trong bộ TKXD30 - Trợ giúp thiết kế xây dựng)

taotao395
30-12-2004, 09:04 AM
Ông anh TaoTao395 này vừa lạc hậu lại nghiệp dư. Nếu ông anh vẫn còn dùng Excel để lập bảng thống kê thì chán lắm... :D
Quả thật ông anh nên đổi cách làm đi, xưa rồi.
He he he... anh là dân chuyên nghiệp mà :D anh đã so sánh tốc độ với một đồng chí làm theo một số chương trình thống kê phổ biến => kết quả anh ăn đứt :D Nói chung là dân chuyên nghiệp thì cần xác lập phong cách riêng, không nên thay đổi chương trình làm nhiều, anh đánh giá cao tính kế thừa của các bộ hồ sơ, nó tiết kiệm đáng kể công sức. :).
Còn các đồng chí lập trình cho cái vụ thống kê nên xem thêm mảng excel ứng dụng mạnh hơn nhiều (và không phải dùng máy tính tay hỗ trợ khi thống kê bằng CAD - cho các phép tính phụ : cộng các nhịp cho chiều dài tổng chẳng hạn) :D

dnl
30-12-2004, 09:25 AM
:D Mạn phép anh em trình bày thử cách thống kê không dùng chương trình.
Tôi đã chinh chiến 7 năm trên lĩnh vực thợ vẽ, đã gặp một số loại lisp thống kê thép na ná kiểu các bác nói trên, nhưng không hợp. Chỉ cần dùng bảng excel thống kê, sau đó chèn sang CAD, dùng một lệnh căn lề chuyển các chữ từ bảng excel sang bảng thống kê có sẵn, cuối cùng vẽ lại các hình thép.
Nói vậy có vẻ dài và mất công. Nhưng cần thực dụng một chút.
- Việc gõ các cột fi, cdài 1 thanh, số lượng tương đương với việc các bác gõ trong chương trình, phần tổng cdài, trọng lượng excel tính
- Past Special sang CAD, chuyển số vào bảng thống kê có sẵn là hoàn toàn đơn giản.
- Việc vẽ lại các hình thép: không phức tạp và lâu như mọi người ngại. Bởi với một bảng thống kê có trước cùng loại thì chỉ việc copy sang, sửa vài số - xong. Ví dụ :
+ với thép sàn, loại thanh thép đa số chỉ có 2 loại thẳng và có móc, móc fi 8 là 60, fi 6 là 50 cố định không cần gõ lại;
+ với thép dầm : thép thẳng, có bẻ ke, đai - một công trình thường không có quá 5 loại dầm tức là chỉ có vài loại đai, đầu ke...
Quá đơn giản. Thống kê như vậy có tính kế thừa rất cao :D. Bảng excel có thể chỉnh sửa, chuyển cho dự toán :D Thao tác cộng trừ bằng excel nhanh hơn hẳn so với CAD :D
Với chương trình ví dụ ở trên, tôi thấy phải nhập rất nhiều số thì mới có 1 dòng thống kê mà nhiều khi các số đó trùng lặp liên tục.
Mẹo vặt: lâu nhất là bảng thống kê thép dầm. Khi vẽ dầm nên đánh số thép thống nhất: thép dưới là số 1, 1a, thép trên là 2, 2a, thép tăng cường gối có bẻ mỏ là số 4, không bẻ mỏ là số 5, đai là số 6... Như vậy khi chuyển sang dầm khác có tính kế thừa cũng như bảng thống kế rất dễ theo dõi.
Chào thân ái :D
Ý tưởng của bác rất hay, đặc biệt trong tk kết cấu thép. Em đã thử tuy nhiên gặp kho khăn trong việc căn lề khi chuyển từ xeo sang cad số má cứ nhảy loạn cả lên, bác có thể chỉ giáo một chút kinh nghiệm được không?

taotao395
30-12-2004, 09:31 AM
Khâu input sẽ thực hiện trong Excel làm xong xuất ra file text và import vào CAD dùng một hàm lập trình chuyển thành bảng thống kê. Như vậy ta có thể dùng bảng excel để làm dự toán, còn khâu nhập liệu thì môi trường excel dễ hơn trong CAD.
Nếu phải xuất sang text rồi lại sang CAD thế thì phức tạp quá đồng chí ạ. Hoàn toàn có thể xuất thẳng bảng số từ excel sang CAD, scale một chút cho phù hợp kích thước của bảng thống kê mẫu và chuyển số sang bằng 1 lệnh căn lề cho text của CAD - xong. Còn bảng excel thì đã có sẵn các hàm tính tổng trọng lượng thép theo từng fi, làm một lần, lần sau copy lại - thế là có tổng khối lượng cho dự toán. Ok? Tôi vẫn cung cấp các bảng này cho bên dự toán rất tiện dụng.
Thực ra trong EXCEL vẫn có thể làm một số marco hỗ trợ vẽ sẵn hình dạng thép, nhưng dễ bị diệt virus quá tay tiêu diệt mất - không tiện lắm

taotao395
30-12-2004, 09:46 AM
Ý tưởng của bác rất hay, đặc biệt trong tk kết cấu thép. Em đã thử tuy nhiên gặp kho khăn trong việc căn lề khi chuyển từ xeo sang cad số má cứ nhảy loạn cả lên, bác có thể chỉ giáo một chút kinh nghiệm được không?
Đồng chí thử add một đoạn lisp sau vào acad.lsp xem. Sẽ thấy thích ngay mà.
câu lệnh : tt
chọn 1 chữ làm chuẩn - enter
chọn cột chữ cần căn thẳng - enter
cả cột chữ đó sẽ thẳng thành 1 cột theo chữ mẫu, cùng loại chữ và các thuộc tính khác với chữ mẫu.
Nếu căn lề số thì nên để chữ mẫu có justify = right
Thử xem, sẽ thấy thích ngay mà.

dnl
30-12-2004, 11:57 AM
Đồng chí thử add một đoạn lisp sau vào acad.lsp xem. Sẽ thấy thích ngay mà.
câu lệnh : tt
chọn 1 chữ làm chuẩn - enter
chọn cột chữ cần căn thẳng - enter
cả cột chữ đó sẽ thẳng thành 1 cột theo chữ mẫu, cùng loại chữ và các thuộc tính khác với chữ mẫu.
Nếu căn lề số thì nên để chữ mẫu có justify = right
Thử xem, sẽ thấy thích ngay mà.
Cảm ơn bác, em thấy hơi thinh thích rồi :)

taotao395
30-12-2004, 01:09 PM
Hổng có chi :D
Chỉ một đoạn con con vậy thôi nhưng có nó ăn xeo ngon hơn hẳn :D (he he toàn đi tích cóp mẹo vặt mà có) :D

YaLang
30-12-2004, 01:15 PM
:D Mạn phép anh em trình bày thử cách thống kê không dùng chương trình.
Tôi đã chinh chiến 7 năm trên lĩnh vực thợ vẽ, đã gặp một số loại lisp thống kê thép na ná kiểu các bác nói trên, nhưng không hợp. Chỉ cần dùng bảng excel thống kê, sau đó chèn sang CAD, dùng một lệnh căn lề chuyển các chữ từ bảng excel sang bảng thống kê có sẵn, cuối cùng vẽ lại các hình thép.
Nói vậy có vẻ dài và mất công. Nhưng cần thực dụng một chút.
- Việc gõ các cột fi, cdài 1 thanh, số lượng tương đương với việc các bác gõ trong chương trình, phần tổng cdài, trọng lượng excel tính
- Past Special sang CAD, chuyển số vào bảng thống kê có sẵn là hoàn toàn đơn giản.
Chào thân ái :D Tôi cũng đồng tình với taotao395, xin chỉ giúp: làm cách nào có thể chèn nhiều trang Excel sang ACAD một cách tiện lợi nhất mà không phải "sì ca le" (scale)?! Tôi cũng đã chèn nhưng thấy cực quá!
Hiện tôi đang dùng một chương trình viết bằng LSP, hàng mĩ chính gốc đó (mĩ phiến: miễn phíhttp://www.ketcau.com/images/smilies/tongue.gif), thấy cũng "tiềm tiệm", gởi taotao395 và qúy huynh_đệ_tỳ_muội cũng "xơi" thử.
Hàng trên là của đi xin, tôi cũng có ý định như các bạn: dùng Excel để hỗ trợ tinh tóan, dùng ACAD để vẽ, nên có viết một chương trình nhỏ, chỉ mới tạm xong (vì chưa bao quát hết tình huống khi sử dụng) phần tính, còn phần vẽ thì chưa xong, cũng xin gởi để qúy huynh_đệ_tỳ_muội góp ý!
Thân chào

taotao395
30-12-2004, 01:44 PM
Tôi có xem qua một chút - Coi bộ đồng chí làm cũng kỳ công đây :D
Việc chèn Excel qua CAD bằng Past Spec - AutoCad entities rất dễ.
Từ bảng chèn đó chuyển sang 1 bảng thống kê có sẵn tiêu đề, hàng lối cũng dê chứ khó khăn gì. Chỉ scale reference là xong. Không khó không khó

tommy
30-12-2004, 07:58 PM
em có dùng 1 chương trình à ko là 1 file nguồn Lisp chứ, mỗi lần dùng phải appload lên, tuy nhiên dùng cũng rất tiện , em chưa dùng chương trình của bác nglam_adg, tuy nhiên em sẽ tham khảo. biết đâu lại phát triển tiếp đc gì đó = autolisp

Robinho
30-12-2004, 10:52 PM
Ha ha! ông anh Taotao395 nghe người ta nói chưa? dùng Excel để làm thống kê chỉ thể hiện đó là một bản vẽ vô cùng nghiệp dư :D

taotao395
31-12-2004, 12:09 PM
Ha ha! ông anh Taotao395 nghe người ta nói chưa? dùng Excel để làm thống kê chỉ thể hiện đó là một bản vẽ vô cùng nghiệp dư :D
Đó là chú chưa biết thế nào là dân chuyên nghiệp... Nên xem lại mình đang ở đâu :D :D :D

revzmoon
09-01-2005, 03:38 PM
Đó là chú chưa biết thế nào là dân chuyên nghiệp... Nên xem lại mình đang ở đâu :D :D :D

Mấy bác này hay thật đấy, sao lại đả kích nhau như thế. Chúng ta đóng góp ý kiến, mỗi người 1 ý, nếu hợp nhau thì phát triển tiếp, không hợp thì thôi, chứ sao lại..... :confused:

tungduong
09-01-2005, 04:51 PM
revzmoon nói đúng!
Các vị đừng chê bai nhau được không?Như dùng STADD thì chê SAP2000,ETABS và ngược lại.Mỗi người có cách đi riêng mà!

hacidmember
09-01-2005, 10:37 PM
Ý tưởng của taotao395 rất hay, nhất là sô liệu thống kê sẽ phục vụ khâu dự toán tiết kiệm được rất nhiều thời gian, đề nghị taotao395 viết kỹ hơn thành một qui trình cụ thể để chia sẻ cho anh em học tập và góp ý cho hoàn thiện hơn (thống kê nhanh, thể hiện đẹp).

ttkh
23-01-2005, 06:01 PM
[QUOTE=YaLang]
Tôi cũng đồng tình với taotao395, xin chỉ giúp: làm cách nào có thể chèn nhiều trang Excel sang ACAD một cách tiện lợi nhất mà không phải "sì ca le" (scale)?! Tôi cũng đã chèn nhưng thấy cực quá!
Hiện tôi đang dùng một chương trình viết bằng LSP, hàng mĩ chính gốc đó (mĩ phiến: miễn phí), thấy cũng "tiềm tiệm", gởi taotao395 và qúy huynh_đệ_tỳ_muội cũng "xơi" thử.
Hàng trên là của đi xin, tôi cũng có ý định như các bạn: dùng Excel để hỗ trợ tinh tóan, dùng ACAD để vẽ, nên có viết một chương trình nhỏ, chỉ mới tạm xong (vì chưa bao quát hết tình huống khi sử dụng) phần tính, còn phần vẽ thì chưa xong, cũng xin gởi để qúy huynh_đệ_tỳ_muội góp ý!
Thân chào
File Kèm Theo LSP.zip (191.2 KB, 90 lần tải)
THONGKE.zip (415.9 KB, 96 lần tải)
huongdan.txt (8.5 KB, 65 lần tải)
Cho em hoi tí
Trong lile huongdan.txt của anh có đoạn
6/ Thực hiện theo hướng dẫn
Lưu ý:
+ Cài đặt từ ổ A.
+ Ổ A: Hệ thống gọi ổ đĩa nào là A thì phải chép thư mục LSP lên đó để cài đặt.

Sử dụng Thống Kê trong ACAD:
1/ Tải (load) file "tkct.fas"
2/ Đánh lệnh "tkt" rồi nhấn nút ENTER
em chỉ tìm thấy caidat.fas và cailai.fas trong lile LSP.zip mà thôi không thấy tkct.fas đâu cả
Nếu ổ A là ổ mềm thì có cài được không. Xin anh chỉ giup.

ttkh
23-01-2005, 06:05 PM
Tôi cũng đồng tình với taotao395, xin chỉ giúp: làm cách nào có thể chèn nhiều trang Excel sang ACAD một cách tiện lợi nhất mà không phải "sì ca le" (scale)?! Tôi cũng đã chèn nhưng thấy cực quá!
Hiện tôi đang dùng một chương trình viết bằng LSP, hàng mĩ chính gốc đó (mĩ phiến: miễn phíhttp://www.ketcau.com/images/smilies/tongue.gif), thấy cũng "tiềm tiệm", gởi taotao395 và qúy huynh_đệ_tỳ_muội cũng "xơi" thử.
Hàng trên là của đi xin, tôi cũng có ý định như các bạn: dùng Excel để hỗ trợ tinh tóan, dùng ACAD để vẽ, nên có viết một chương trình nhỏ, chỉ mới tạm xong (vì chưa bao quát hết tình huống khi sử dụng) phần tính, còn phần vẽ thì chưa xong, cũng xin gởi để qúy huynh_đệ_tỳ_muội góp ý!
Thân chào
Trên là bài của anh YALANG
Cho em hoi tí
Trong lile huongdan.txt của anh có đoạn
6/ Thực hiện theo hướng dẫn
Lưu ý:
+ Cài đặt từ ổ A.
+ Ổ A: Hệ thống gọi ổ đĩa nào là A thì phải chép thư mục LSP lên đó để cài đặt.

Sử dụng Thống Kê trong ACAD:
1/ Tải (load) file "tkct.fas"
2/ Đánh lệnh "tkt" rồi nhấn nút ENTER
em chỉ tìm thấy caidat.fas và cailai.fas trong lile LSP.zip mà thôi không thấy tkct.fas đâu cả
Nếu ổ A là ổ mềm thì có cài được không. Xin anh chỉ giup.

YaLang
30-01-2005, 12:51 PM
Trên là bài của anh YALANG
Cho em hoi tí
Trong lile huongdan.txt của anh có đoạn
6/ Thực hiện theo hướng dẫn
Lưu ý:
+ Cài đặt từ ổ A.
+ Ổ A: Hệ thống gọi ổ đĩa nào là A thì phải chép thư mục LSP lên đó để cài đặt.

Sử dụng Thống Kê trong ACAD:
1/ Tải (load) file "tkct.fas"
2/ Đánh lệnh "tkt" rồi nhấn nút ENTER
em chỉ tìm thấy caidat.fas và cailai.fas trong lile LSP.zip mà thôi không thấy tkct.fas đâu cả
Nếu ổ A là ổ mềm thì có cài được không. Xin anh chỉ giup.Gởi bạn ttkh
1/ Xin lưu ý với bạn là: chỉ sau khi cài đặt thành công mới có file tkct.fas. Để cài đặt, bạn cứ thực hiện đúng như hướng dẫn trong huongdan.txt là được. Tuy nhiên, có thể là sẽ không biết được tập tin tkct.fas đó nằm ở đâu thôi (nó nằm trong thư mục LSP thuộc đường dẫn mặc định của ACAD, mà đường dẫn này thì mỗi phiên bản ACAD lại khác nhau!)! Bạn có thể dùng chức năng tìm kiếm (Search hoặc Find Files) của Windows hoặc của một trình quản lý tập tin nào đó cũng được (ví dụ: Norton Commander, Total Commander...). Khi đã biết nó nằm ở đâu rối thì chỉ cần tải nó lên (trong ACAD) là chạy được thôi (tất nhiên là phải đánh lệnh tkt).
2/ Ổ mềm là ổ A thì vẫn cài được, không có vấn đề gì.
Xin lỗi bạn nhé: tôi đã nhận được thắc mắc của bạn trên diễn đàn mấy hôm trước, nhưng khi trả lời cho bạn thì không thể nào được (bị từ chối gởi bài!), hôm nay thử gởi lại xem sao!
Cảm ơn bạn đã quan tâm, và chúc bạn thành công. Nếu có gì thắc mắc xin bạn cứ liên hệ với tôi qua diễn đàn hoặc email.
Thân chào

ttkh
14-02-2005, 09:18 AM
;;;
;;; Cong don cac so chon
; ****************************************************************
(defun C:CO (/ cnt enam ent pnt s1 tot v1 val)
(setvar "CMDECHO" 0)
(prompt "\nChon cac so muon cong: ")
(setq s1 (ssget))
(prompt "\nDiem dat ket qua: ")
(setq pnt (getpoint))
(setvar "cmdecho" 0)
(setq tot 0)
(if s1
(progn
(setq cnt (1- (sslength s1)))
(while (>= cnt 0)
(setq enam (ssname s1 cnt))
(setq ent (entget enam))
(if (= (cdr (assoc 0 ent)) "TEXT")
(progn
(setq v1 (assoc 1 ent))
(setq val (atof (cdr v1)))
(if (and (numberp val) (/= val 0))
(progn
(setq tot (+ val tot))
)
)
)
)
(setq cnt (1- cnt))
))
)
(setq tot (rtos tot 2))
(command "text" pnt "" "" tot)
(princ)
(setvar "cmdecho" 1)
)
Xin các anh chỉ giúp : Đoạn Lisp này có gì sai mà em thể thực hiện được.
Sau khi đánh lệnh, chọn đối tượng cần cộng thì kết quả là 0.000

nglam_adg
14-02-2005, 02:36 PM
;;;
;;; Cong don cac so chon
; ****************************************************************
(defun C:CO (/ cnt enam ent pnt s1 tot v1 val)
(setvar "CMDECHO" 0)
(prompt "\nChon cac so muon cong: ")
(setq s1 (ssget))
(prompt "\nDiem dat ket qua: ")
(setq pnt (getpoint))
(setvar "cmdecho" 0)
(setq tot 0)
(if s1
(progn
(setq cnt (1- (sslength s1)))
(while (>= cnt 0)
(setq enam (ssname s1 cnt))
(setq ent (entget enam))
(if (= (cdr (assoc 0 ent)) "TEXT")
(progn
(setq v1 (assoc 1 ent))
(setq val (atof (cdr v1)))
(if (and (numberp val) (/= val 0))
(progn
(setq tot (+ val tot))
)
)
)
)
(setq cnt (1- cnt))
))
)
(setq tot (rtos tot 2))
(command "text" pnt "" "" tot)
(princ)
(setvar "cmdecho" 1)
)
Xin các anh chỉ giúp : Đoạn Lisp này có gì sai mà em thể thực hiện được.
Sau khi đánh lệnh, chọn đối tượng cần cộng thì kết quả là 0.000
Tôi thấy, về cơ bản không có vấn đề gì. Do điều kiện lọc đối tượng chưa rõ ràng -> dẽ dẫn đến lỗi bắt đối tượng.
Đoạn mã lệnh của cậu chỉ có thể cộng được số dạng Text nguyên bản. Các đối tượng khác như Mtext, Dim Text... thì sẽ cho ra kết quả = 0.000

Đây là đoạn mã chuẩn của lệnh trên. Lệnh có thể cộng được Text và Mtext.
Bạn có thể so sánh rồi tìm hiểu.

Chúc thành công !
;-------------------------------
;Cong Text, Mtext
;-------------------------------
(defun C:CONG (/ cnt enam ent pnt s1 tot v1 val)
(setvar "CMDECHO" 0)
(prompt "\nChon cac so muon cong: ")
(setq s1 (ssget '((0 . "*Text")) ))
(setvar "cmdecho" 0)
(setq tot 0)
(if s1
(progn
(setq cnt (1- (sslength s1)))
(while (>= cnt 0)
(setq enam (ssname s1 cnt))
(setq ent (entget enam))
(if (or (= (cdr (assoc 0 ent)) "TEXT")
(= (cdr (assoc 0 ent)) "MTEXT"))
(progn
(setq v1 (assoc 1 ent))
(setq val (atof (cdr v1)))
(if (and (numberp val) (/= val 0))
(progn
(setq tot (+ val tot))
)
)
)
)
(setq cnt (1- cnt))
))
)
(if(and tot (setq pnt(getpoint(strcat "\nDiem dat ket qua <"(setq tot (rtos tot 2 3))">: "))))
(command "_.Text" pnt "" "" tot)
(princ tot))
(princ)
)

123456789
14-02-2005, 09:13 PM
Bác nào có ý tưởng về lệnh scale đối tượng của CAD theo hai chiều chưa, liệu có thể thực hiện được không. Tui đang nghiên cứu viết bằng Lisp nhưng ý tưởng trình bày...

Tran Duc Minh
15-02-2005, 05:03 PM
Tiện ích anh YaLang Post. Em đao về chạy rồi. Chạy ACAD rất hay, chỉ sau bị lổi, ko cho phép chỉnh sữa, cứ báo là "bad number..:nil" gì đó hoài. Anh chỉnh sửa lại nhé anh. Rất hay anh ạ. Nếu anh Open sourse ra, em có thể giúp anh chỉnh sửa lại những lổi đó.
Xài mà cứ bị lổi hòai, bực mình lắm anh ạ.!

YaLang
17-02-2005, 01:05 PM
Tiện ích anh YaLang Post. Em đao về chạy rồi. Chạy ACAD rất hay, chỉ sau bị lổi, ko cho phép chỉnh sữa, cứ báo là "bad number..:nil" gì đó hoài. Anh chỉnh sửa lại nhé anh. Rất hay anh ạ. Nếu anh Open sourse ra, em có thể giúp anh chỉnh sửa lại những lổi đó.
Xài mà cứ bị lổi hòai, bực mình lắm anh ạ.!
Chào bạn Minh!
Trước tiên: xin lỗi vì đã làm bạn phải "bực mình", sau là: xin cảm ơn vì bạn đã quan tâm đến chương trình!
Để khỏi phải "bực mình", bạn nên thực hiện như sau:
1/ Trong khi đang vẽ bảng thống kê thì xin "tuyệt đối không dùng đến các chức năng sửa chữa"!
2/ Chỉ sau khi đã vẽ xong bảng TKT rồi, vẽ bảng tổng hợp, lưu nó (save file) lại, đóng nó vào, rồi... lại mở nó ra (!), khởi động lại chương trình thống kê thép, đánh lệnh tkt, chọn bất cứ chức năng nào (sửa chữa, tổng hợp thép theo từng cấu kiện...) đều được cả, nhưng nhớ là "tuyệt đối không được đụng đến 02 chức năng đầu (vẽ bảng thống kê, vẽ bảng tổng hợp) trước và đang khi dùng các chức năng khác"! Hình như nó bị bệnh "trùng biến" hay sao đó!
Nếu bạn thích, tôi sẽ gởi đến bạn các tập tin nguồn của nó (chủ nhân của nó đã gởi cho tôi, cũng với ý định như bạn), tuy nhiên, chỉ có những tập tin cũ thôi, những tập tin cuối cùng (được dịch ra để sử dụng) đã "qua đời trong một cơn bạo bệnh" rồi (định dạng lại ổ cứng để cài lại hệ thống)! Nhưng mà... nhức đầu lắm, nó có hàng... "đống" biến, không biết đâu mà rờ! Mong rằng bạn kiên nhẫn hơn tôi!
Bởi vậy, dựa trên mẫu có sẵn, tôi đang viết một chương trình khác bằng VBA thông qua Excel (cũng đã gởi lên để các bạn tham khảo, nhưng mới chỉ là thử nghiệm).
Thân.
Tái bút: nếu bạn chỉnh sửa tốt hơn thì nhớ gởi lên cho anh em cùng dùng nhé!

Ban QT ơi, sao không dùng được các chức năng định dạng chữ?!! (làm đậm, nghiêng, gạch dưới chữ)

ketcau_vn
17-03-2005, 02:14 PM
Mục này hay thế mà ít người quan tâm thật !

anhtuan3t
21-03-2005, 10:40 AM
Cac ban oi! Tai sao to Download thong ke cot thep xuong nhung khong thuc hien duoc. Co gi nhan giup nhe! Xin cam on!

anhtuan3t
21-03-2005, 10:41 AM
Minh co mua dia Dutoan2002 tren nen Excel ve, co *****, nhung khong hieu sao khong lam the nao giai ma Fonts duoc. Co ai biet khong mach gium voi. Minh cam on nhieu.

nglam_adg
21-03-2005, 03:10 PM
Start > settings > Control Panel > Fonts >
Vào menu: File > Install New Font...
Chọn thư mục chứa bộ cài dự toán, tìm xem có Fonts không (thường là có)
Nhấn Select All rồi OK.
Log Off hoặc Khởi động lại Windows.
TCVN Fonts cho dự toán 2002:

Vandtd
23-03-2005, 04:57 PM
Có bác nào viết "delaunay triangulation" bằng ngôn ngữ Lisp không? hoặc bác nào biết giải thuật của nó không?

tdhtkcd
23-03-2005, 06:06 PM
"delaunay triangulation" mà làm bằng lisp thì đỉnh thật đấy.... :D.

alpha_xd
30-03-2005, 11:51 AM
Nếu bác nào không thích cài đặt rắc rối mà vẫn cộng đươc các số chọn trong thống kê thép chỉ bằng lisp thì tui cho file lisp về add vô mà xài khỏi cài chi ráo mà vẫn thống kê nhanh chóng

nglam_adg
03-04-2005, 06:54 PM
...........................

nglam_adg
20-04-2005, 02:59 PM
Khi mới biết Autolisp, tôi có sưu tầm được 1 CT Vlisp khá hay. Đây là môi trường lập trình Lisp tiêu chuẩn, chạy độc lập. CT có thể kiểm tra lỗi nhập liệu - các dấu " () ' ....
Download files nén, bung vào bất cứ đâu trên ổ cứng (CT không cần cài đặt). Vào thư mục Vlisp, chạy files Vlisp.exe

Honey
22-04-2005, 03:10 PM
Minh có cả chương trinh viết bằng VLisp. Ban nào muon dùng thi Mail cho Minh. Nglam adg cho minh hoi lam the nao ma tai file lên cho mọi người Download dùng.

nglam_adg
22-04-2005, 03:29 PM
http://www.ketcau.com/showthread.php?t=17

Honey
22-04-2005, 03:46 PM
theo huong dan tim nut nay : "POST REPLY" , nhung minh tim khong ra. chi minh voi.

ledinhsang
22-04-2005, 09:41 PM
Thằng em đang bắt đầu tập tành nhãy vào Lisp đây nhưng còn mơ hồ quá, chỉ được vài lịnh con con thôi. Bác nào có thể chỉ vẽ cho một vài kinh nghiệm bổ ích? hoặc vài file để thằng em tham khảo được không ạ? còn về tài liệu thì cuốn nào thì OK?
Còn Bác DAOBKBA thì bao giờ có thời gian rảnh đấy ạ?

nglam_adg
22-04-2005, 10:17 PM
Thằng em đang bắt đầu tập tành nhãy vào Lisp đây nhưng còn mơ hồ quá, chỉ được vài lịnh con con thôi. Bác nào có thể chỉ vẽ cho một vài kinh nghiệm bổ ích? hoặc vài file để thằng em tham khảo được không ạ? còn về tài liệu thì cuốn nào thì OK?
Còn Bác DAOBKBA thì bao giờ có thời gian rảnh đấy ạ?
Đây là những sách bạn nên đọc:
1. Ngôn ngữ AutoLisp dùng trong AutoCAD (Trần công Nghị - Vũ Tiến Đạt)
2. AutoLisp và kỹ thuật lập trình ứng dụng (Bành Tiến Long - Nguyễn Chí Quang - Hoàng Vĩnh Sinh)
3. Inside AutoCAD (AutoDesk)
4. Ngôn ngữ lập trình AutoLisp (Nguyễn công Sơn - Phạm đăng Khoa)
5. Ngôn ngữ lập trình AutoLisp (Nguyễn hữu Lộc - Nguyễn Thanh Trung)
6. Hướng dẫn sử dụng AutoCAD (Hoàng ngọc Giao - tập 4+5)
7. Tony Hotchkiss - Steve Bialek:
- Advanced AutoLISP Programming Correspondence Course
- An Introduction to AutoLISP
- Introduction to AutoLISP Programming Correspondence Course
8. DXF Reference Guide (AutoDesk)

Và phần Help của các bản AutoCAD.

----------------------
theo huong dan tim nut nay : "POST REPLY" , nhung minh tim khong ra. chi minh voi.
Quên mất: "POST REPLY" tạm dịch là "Gởi trả lời"
Cứ bấm đại vào chỗ "Đổi Sang Khung Lớn" chắc là được thôi.

tdhtkcd
24-04-2005, 02:42 PM
Giả sử em có 1 file "abc_name.arx" rồi.
Anh Lam và các anh có kinh nghiệm cho em hỏi cách tạo file set up cho ứng dụng của em (viết trên Cad)giống như NoVa hay SD.
Để sau khi người dùng cài đặt là có thể xài được.Em chỉ biết cách tạo file set up theo WZ với file "abc_name.exe" thôi.
Cám ơn các anh nhiều.

nglam_adg
24-04-2005, 03:45 PM
Giả sử em có 1 file "abc_name.arx" rồi.
Anh Lam và các anh có kinh nghiệm cho em hỏi cách tạo file set up cho ứng dụng của em (viết trên Cad)giống như NoVa hay SD.
Để sau khi người dùng cài đặt là có thể xài được.Em chỉ biết cách tạo file set up theo WZ với file "abc_name.exe" thôi.
Cám ơn các anh nhiều.
Hiện nay có rất nhiều chương trình đóng gói sản phẩm - Nhằm tạo ra một "sản phẩm" thực sự để phân phối sử dụng. Dùng chương trình nào không quan trọng, chỉ cần có 4 yêu cầu sau là có thể đáp ứng được các phần mềm ứng dụng trên nền CAD:
1. Thay đổi - Bổ xung nội dung cho 1 file dữ liệu dạng Text (dùng để can thiệp các files Lisp).
2. Có khả năng tìm hoặc nhận dạng được các dạng files (được chỉ định trước) trên toàn ổ cứng (kể cả định dạng NTFS).
3. Có cấu trúc điều kiện khi thi hành tác vụ (nhằm kiểm tra, lựa chọn... thông số phiên bản định cài ứng dụng).
4. Có giao diện trực quan để dễ tiếp cận.

Nếu chương trình có khả năng can thiệp, bổ xung, thay đổi Registry thì càng tốt.

Thông thường, cách tạo bộ cài đặt (Setup) là Ghi nhớ địa chỉ, đường dẫn... copy dữ liệu đến. Sau đó, gán chúng cho chương trình tạo cài đặt. Lập sẵn "kịch bản" khi có sự lựa chọn từ người dùng -> Thay đổi các files hệ thống của AutoCAD tương ứng (để có thể Load chương trình ngay sau khi cài). Nếu CT có sự can thiệp về hệ thống (như System Fonts, DLL, Registry...) thì nên đặt chế độ khởi động lại Windows sau khi cài. Bạn cũng nên tham khảo cấu trúc của các bản Windows vì mỗi hệ điều hành lại có cấu trúc phân cấp dữ liệu khác nhau (AutoCAD cũng vậy).

phpminhnai
24-04-2005, 09:08 PM
Mấy anh giỏi thật, quả thật em cũng đang tập tò với AutoLisp, nhưng quả thật khi đụng vào thấy hay thật. Nhưng những gì mình làm thì họ làm hết trơn, nhưng mình làm chưa chắc bằng họ. Bởi vậy thấy chán lắm. Nhưng em nghỉ nếu mình làm mà ứng dụng thực tế, như chẳng hạn trong phạm vi nhỏ nhưng đủ sống rồi, qua nhưng cái đồ án, mình làm ra share cho anh em dùng, hi hi có khi còn bán nữa. Mà có khi lại có nhiều người mua, đúng không các anh.

Honey
25-04-2005, 05:18 PM
day la mot so ung dung toi viet bang list, ban nao dung thi tai xuong dung. toi da tai len phien ban moi

tdhtkcd
25-04-2005, 09:23 PM
Hiện nay có rất nhiều chương trình đóng gói sản phẩm - Nhằm tạo ra một "sản phẩm" thực sự để phân phối sử dụng. Dùng chương trình nào không quan trọng, chỉ cần có 4 yêu cầu sau là có thể đáp ứng được các phần mềm ứng dụng trên nền CAD:
1. Thay đổi - Bổ xung nội dung cho 1 file dữ liệu dạng Text (dùng để can thiệp các files Lisp).
2. Có khả năng tìm hoặc nhận dạng được các dạng files (được chỉ định trước) trên toàn ổ cứng (kể cả định dạng NTFS).
3. Có cấu trúc điều kiện khi thi hành tác vụ (nhằm kiểm tra, lựa chọn... thông số phiên bản định cài ứng dụng).
4. Có giao diện trực quan để dễ tiếp cận.

Nếu chương trình có khả năng can thiệp, bổ xung, thay đổi Registry thì càng tốt.

Thông thường, cách tạo bộ cài đặt (Setup) là Ghi nhớ địa chỉ, đường dẫn... copy dữ liệu đến. Sau đó, gán chúng cho chương trình tạo cài đặt. Lập sẵn "kịch bản" khi có sự lựa chọn từ người dùng -> Thay đổi các files hệ thống của AutoCAD tương ứng (để có thể Load chương trình ngay sau khi cài). Nếu CT có sự can thiệp về hệ thống (như System Fonts, DLL, Registry...) thì nên đặt chế độ khởi động lại Windows sau khi cài. Bạn cũng nên tham khảo cấu trúc của các bản Windows vì mỗi hệ điều hành lại có cấu trúc phân cấp dữ liệu khác nhau (AutoCAD cũng vậy).
Cám ơn anh Lam nha.
Em phải thử cái.(Chỉ lo cài xong không dỡ ra được thì xấu hổ lắm.
Không biết lúc các anh viết chương trình thì test như thế nào chứ em thì nông dân lắm! :D ).

Nguyễn-văn-Thu
26-04-2005, 06:21 PM
Quả thực nói là phần mềm tổng quát thì theo tôi không làm được đâu. Tôi đã thử rồi. AutoCAD tự bản thân nó đã rất tổng hợp rồi. Tôi đã qua cái thời sử dụng AutoCAD 10 (trên nền Dos), máy tính khi đó không có đủ bộ đệm để chạy AutoCAD. mỗi lần chạy phải tạo Processor ảo thi mới "bò" được. Tôi đã muốn viết 1 phần mềm đầy đủ các ứng dụng và hầu hết những gì tôi định làm hoặc đã làm thì AutoCAD ngày nay đều có (tốt hơn của tôi rất nhiều). Tồi nghĩ chúng ta chỉ nên phát triển cái ta cần, thực dụng một chút để hỗ trợ công việc đang làm.
Tôi đã thử viết hầu hết những gì hàng ngày mình cũng như các anh em khác phải làm. Có thể những thứ đó không tổng quát nhưng nó làm giảm rất nhiều công sức khi làm việc.
Dưới đây là một vài ứng dụng: (thống kê thép, thư viện, vẽ điện....)

Tôi thấy bạn nglam_adg và Group của bạn đã làm được như vậy là rất hay. Tôi cũng có học tin-học và hành-nghề về vụ này chút đĩnh thì biết là cái ngôn ngữ LISP làm ai cũng sợ cả.
Vậy bạn hãy làm thêm một chức năng nữa đi :
1) Tât cả các thanh (chiều dài 12m) đều được đánh số.
2) Khi bạn cắt một thanh ra, có phần còn lại (có thể là vụn) : bạn đánh số luôn các đoạn vụn còn lại.
3) Khi cân cắt những thanh sắt ngắn hơn, bạn xem lại trong da tabase có thanh nào cùng phi (diameter), có chiều dài gần bằng và bạn dùng cho nó.
4) Mục đích là dùng thép một cách kinh tế hơn. Và chương trình có
thể tìm cách để tìm lượng thép vụn tối thiểu.
Dĩ nhiên bạn phải dùng Cơ-sở Dữ-Liệu.

Tôi có làm một chương trình như vầy nhưng bằng QBasic trong những năm cuối thập niên 1980, nhưng tại Âu-châu, chương trình này chỉ dùng cho những hãng bán thép (họ bán thép cho bê-tông, thanh nguyên dài 12m, nhưng cũng cắt ra, uốn lại, đánh số theo những bảng Thông kê thép mà khách hàng đặt).

Xử dụng chương trình này, bạn sẽ tránh được việc vẽ những thanh dài 6,10m chẳng hạn (chừng 500 cây trở lên), vì bạn biết rằng chiều dài còn lại 5.9m phải được dùng cho việc khác, và có nhiều hy vọng trở nên
thép vụn.

Riêng các bạn còn thích Excel thì nó cũng đúng ở chỗ hợp túi tiền, Excel cũng cho phép lập trình, nhưng rất giới hạn. Ta không thể dùng Excel để giải quyết những vấn đề rắc rối.

nglam_adg
26-04-2005, 07:44 PM
Cảm ơn anh Thu đã góp ý !
Tôi cũng có mấy năm thi công nên rất hiểu ý anh. Hiện nay, trên thị trường, các loại thép (D>8) thông thường có chiều dài 11,7m. Việc tận dụng tối đa vật tư là điều cần thiết phải làm. Hầu hết, trước khi gia công, các kỹ thuật viên phải ra đề tay chứ không căn cứ trên bảng thống kê do thiết kế lập vì thế việc đưa ra lữa chọn như ý anh sẽ làm giảm thời gian tính toán, lựa chon... tại hiện trường. Tôi sẽ thử theo gợi ý của anh.

Honey
27-04-2005, 03:05 PM
Phần tiện ích tính khối lượng cốt thép chạy trong Acad này tôi đã viết cách đây 2 năm rồi nhưng không co diệp cho các bạn dùng. Rồi tình cờ tôi được một Ông anh giới thiệu trang Web Ketcau.com tôi liền gởi chương trình của mình lên đó. Điều tôi vui sướng nhất là được các bạn hưởng ứng. Chương trình có một số lỗi nho nhỏ. tôi đã sửa chữa và đã cập nhật lại. Nếu có gì Các bạn Mail cho tôi nhé.
Địa chỉ mail : ntvan_sgtcc@yahoo.com
Điện thoại : 0983 889288

nglam_adg
17-05-2005, 12:08 PM
Các biến hệ thống của AutoCAD (2k) - Rất cần khi làm việc với AutoLisp.
Được sắp xếp theo thứ tự và viết theo kieu html nên rất dễ tra cứu.

Vũ Đức Lượng
04-06-2005, 05:20 PM
Có ai biết đoạn lisp nào mà khi vẽ hatch thi cập nhật layer có tên là hatch. Làm ơn chỉ giup

nglam_adg
04-06-2005, 11:49 PM
Có ai biết đoạn lisp nào mà khi vẽ hatch thi cập nhật layer có tên là hatch. Làm ơn chỉ giup
;;; Chuyen toan bo Hatch ve Layer _Hatch
(defun C:CHL (/ hat_app)
(setvar "Cmdecho" 0)
(setq hat_app(ssget "X" '((0 . "Hatch")) ))
(if hat_app
(progn
(M_lay "_Hatch") ;Tao Layer _Hatch neu chua co
(command "_.Chprop" hat_app "" "LA" "_Hatch" "")
)
(prompt "\nKhong co vat lieu Hatch.")
)
(princ)
)
;;;
(defun M_Lay_c(layr_name color / tbl t1 t2 key)
(setvar "Cmdecho" 0)
(setq tbl(tblnext "LAYER" 1))
(while tbl
(setq t1(strcase layr_name) t2 (cdr(car(cdr tbl))) )
(if (equal t1 t2) (setq key 1))
(setq tbl(tblnext "LAYER"))
)
(if(/= key 1)
(progn (setq tbl NIL )
(command "_.LAYER" "N" layr_name "C" color layr_name "" )
(princ (strcat "\nLayer "layr_name".... was created."))
)
)
(setq layr_name NIL)
(princ)
)

Vũ Đức Lượng
06-06-2005, 09:46 AM
Em cũng đã thử đoạn mã này của anh, nhưng thấy báo lỗi. Anh xem lại giúp em với. Ở đây em chỉ muốn khi dùng lệnh vẽ chèn vật liệu thì vẫn hiện lên bảng 'Boundary Hatch and fill' và vật liệu vẽ ra phải có layer name la hacth. một số lệnh khác như vẽ dim, text thì em dã làm được, nhưng với Hatch thì không thể nào làm được.
(defun c:Bh ()
(command "layer" "m" "hatch" "c" "251" """")
(command "BHATCH"))

nglam_adg
06-06-2005, 12:11 PM
Em cũng đã thử đoạn mã này của anh, nhưng thấy báo lỗi. Anh xem lại giúp em với. Ở đây em chỉ muốn khi dùng lệnh vẽ chèn vật liệu thì vẫn hiện lên bảng 'Boundary Hatch and fill' và vật liệu vẽ ra phải có layer name la hacth. một số lệnh khác như vẽ dim, text thì em dã làm được, nhưng với Hatch thì không thể nào làm được.
(defun c:Bh ()
(command "layer" "m" "hatch" "c" "251" """")
(command "BHATCH"))
Nếu không muốn hiện lên bảng Boundary Hatch and fill thì chỉ dùng lệnh HATCH:

Command: hatch
Enter a pattern name or [?/Solid/User defined] <ANSI31>: (nhập tên hatch)
Specify a scale for the pattern <1.0000>: (tỉ lệ VL)
Specify an angle for the pattern <0.00>: (góc xoay VL)
Select objects to define hatch boundary or <direct hatch>.

Có thể thử làm thế này:
(command "-Boundary"
"_.Layer " "m" "hatch" "c" "251" """"
"_.Hatch" "<Tên hacth>" "<Tỉ lệ>" "<Góc xoay>" "L" "")

Làm như vậy vẫn còn 1 lỗi nhỏ là nếu layer hatch đã có thì cấu trúc "_.Layer " "m" "hatch" "c" "251" """" sẽ không đúng. Cách khắc phục là dùng hàm (M_lay_c) tôi đã post ở trên .

Vũ Đức Lượng
06-06-2005, 12:24 PM
Em cần là phải hiện lên bảng 'Boundary Hatch and fill '

nglam_adg
06-06-2005, 12:32 PM
Bhatch là lệnh nội trú có liên kết DCL, giá trị trả ra từ các hàm gắn nội dung DCL là không thể can thiệp ngang hàng. Tức là không thể sử dụng lựa chọn của người dùng trong khi đang chạy lệnh. Vì vậy AutoCAD mới có lệnh Hatch (không liên kết DCL) dùng cho các lệnh mở rộng.

Tran Duc Minh
17-07-2005, 12:51 PM
Cho phép em câu sang chuyện khác nhe:
Em đang làm 1 đoạn lisp. Em đang cần 1 đoạn code để detect (nhận dạng) từng Phiên bản Cad (2000,2004,2005...). Các anh chỉ em với.

nglam_adg
17-07-2005, 02:58 PM
Cho phép em câu sang chuyện khác nhe:
Em đang làm 1 đoạn lisp. Em đang cần 1 đoạn code để detect (nhận dạng) từng Phiên bản Cad (2000,2004,2005...). Các anh chỉ em với.
(setq ver_now (getvar "ACADVER"))
(cond
((= (atof ver_now) 12.00)(setq ver_disp "R12"))
((= (atof ver_now) 14.00)(setq ver_disp "R14"))
((= (atof ver_now) 15.00)(setq ver_disp "2000"))
((= (atof ver_now) 15.06)(setq ver_disp "2002"))
((= (atof ver_now) 16.00)(setq ver_disp "2004"))
((= (atof ver_now) 16.10)(setq ver_disp "2005"))
((= (atof ver_now) 16.20)(setq ver_disp "2006"))
((> (atof ver_now) 16.20)(setq ver_disp "200x"))
);cond

Biến ver_disp thể hiện tên phiên bản AutoCAD.

civil
22-07-2005, 03:40 PM
Bác nào có bộ sư tập lisp nào mà tiện dụng cho công tác thiết kế, up lên đây share cho anh em được không ? :)

luunhieu
18-08-2005, 03:09 PM
Chào mọi ng` , em co lỗi trong AutoLisp, nhưng không biết cách sửa, nhờ các anh tải 2 files này và xem giúp dùm!

kthung
07-09-2005, 05:01 PM
luu nhieu thân mến !
Chương trình của bạn bị lỗi ở câu lệnh sau :
(command ".qleader" "mid" PTV12 (strcat "@" (rtos (* L (/ 3.0 8))) "<120") ^e)
Sau đây là một vài góp ý cho bạn :
1. Không nên dùng lệnh (command ...) để tạo đối tượng. Nên viết các hàm để tạo theo mã DXF. VD : Tạo một đối tượng line đi qua 2 điểm :
(defun MakeLine (pt1 pt2)
(entmakex (list (cons 0 "LINE") (cons 10 pt1) (cons 11 pt2)))
)
Hàm này trả về tên của đối tượng .
2 . Không chọn đối tượng theo kiểu (ssget "w" ... vì rất dễ chọn phải đối tượng gây ra lỗi. Nên gắn thêm xdata cho đối tượng để quản lý.
3 . Không chọn điểm theo kiểu "osnap" , như bạn dùng là "mid", và chính cái này gây ra lỗi chương trình. (mình xem không kỹ nên mới thấy lỗi ở đó). Cái này cũng nên viết hàm đi. Mã rất đơn giản mà.

Cuong_gt41
20-09-2005, 10:23 AM
Việt hóa AutoCad?????
Theo tôi công việc này ko có ý nghĩa cao lắm về mặt sử dụng.Tại sao chúng ta cứ cho rằng việc tạo ra một phần mềm có giao diện tiếng Việt là sẽ giúp cho người sử dụng nhỉ. Tôi cũng đã từng dịch giao diện của Slope/W sang tiếng Việt nhưng thấy việc đó thật vô ích, có khi còn giảm ý nghĩa của từ gốc, gây ảnh hưởng đến một số người sử dụng do việc Việt hóa đó.
Trong giao diện các chương trình Windows thường có các Menu: File, Edit, View, Tools, Help...với các lệnh như Open, Close, Exit, Copy, Cut, Paste...Các từ này được những nhà lập trình nghiên cứu rất kỹ khi sử dụng bởi tính ngăn gọn, dễ hiểu. Khi chúng ta dịch chúng sang tiếng Việt thì cũng phải tìm những từ có nghĩa tương tự, cũng ngắn gọn, dễ hiểu, điều đó thật không dễ mà hiệu quả thì chưa biết thế nào.
Tôi xin lấy những ví dụ :
File => Tệp
Refesh => Làm tươi
Edit => Chỉnh
Windows => Cửa sổ
View => Nhìn
Tools => Công cụ
......
.....

Các bạn thử nhìn và so sánh xem khi đưa các từ tiếng Việt đó vào phần mềm thì sẽ thế nào???
Đó là chưa xét đén tình huống dùng VisualLisp rất khó can thiệp vào hệ thống của Windows để thay đổi Font của hệ thống sang font Tiếng Việt.
Theo tôi, nếu bạn sử dụng tốt VLisp thì bạn hãy viết những ứng dụng hỗ trợ trong công việc thiết kế xây dựng, điều đó sẽ hiệu quả hơn.
Trên đây là những điều tôi rút ra từ bài học của chính bản thân tôi, mong rằng không làm các bro hiểu lầm.
Em đồng ý với anh.mà Việt hóa thì có gì là khó đâu.nếu cần thì có thể việt hóa 100% Autocad ấy chứ

anrgymas
27-09-2005, 07:37 PM
Xin chào!
Mình tên là Trần Nam Hà , sinh viên Đại học Thủy Lợi, lớp 43C3 (năm 5)
Khi xem các bạn thảo luận về các tiện ích hỗ trợ trong Cad và Autolisp mình thấy rất hay.
Mình vốn cũng có chút ít kinh nghiệm về Autolisp và Visualisp hy vọng sẽ tham gia được với các bạnl
Nhân đây mình xin gửi một bộ tiện ích mà mình vừa viết xong là
CadLisp+ v2005
Bao gồm:
KCCD : Dùng để tính khoảng cách cộng dồn trực tiếp từ mặt cắt dọc ngang bằng chuột chọn liên tiếp các điểm tính toán, kết quả sẽ ra bảng gồm khoảng cách và khoảng cách cộng dồn (cm)
DDM: Vẽ đường đồng mức, đường đẳng giá trị , nội suy từ các giá trị của điểm nút.
tải về trong thư viện phần mềm của trang kết cấu hoặc:
Download file (http://www.geocities.com/ktnt2003/CADLisp.zip)
Liên hệ:
Trần Nam Hà
-Nhà riêng: 125, đường K1B, Cầu Diễn, Từ Liêm, Hà Nội
-Tel : 7.643.981
hoặc liên hệ với Dương qua số city phone: 9.178.253
- Đại học thủy lợi Hà Nội , lớp 43C3
Bản này là Free cho 15 người đầu tiên kể tư ngày post bài
Giá thương mại: 1,8$, 25.000VND
- Hy vọng các bạn ủng hộ.
- Hơn nữa bộ CADLisp+ này còn nhiều tiện ích nữa chưa bổ sung:
Tính kênh, vẽ đường mặt nước, vẽ lưới thấm... đang sắp hoàn thành và giá vẫn như ban đầu không hơn.

mai van tri
27-09-2005, 08:17 PM
Chương trình của chú anrgymas cũng bán nữa hả.

Honey
28-09-2005, 08:53 AM
ch­ương trinh chỉ có vậy thi bán ai mà mua. Bạn nên nghiên cứu thêm nhé.

luan2005
28-09-2005, 10:04 AM
Cái đó mà gọi là phần mềm à, khó hiểu nhỉ?

anrgymas
28-09-2005, 01:18 PM
Híc các bác nói nghe sợ quá. Có thể em dùng thuật ngữ sai, thế bác đã dùng thử chưa mà nói như vậy.

kthung
28-09-2005, 01:43 PM
Phần nội suy cao độ và vẽ đường đồng mức là load trên mạng về chứ có phải tự viết đâu mà đòi bán. Chương trình không giải quyết được 1 vấn đề cụ thể từ đầu đến cuối thì không gọi là phần mềm, chỉ là các tiện ích thôi. Cố viết nốt phần còn lại, chắc sẽ có sinh viên thủy lợi mua !

Kidsmart1981
29-09-2005, 11:01 AM
:D
http://en.wikipedia.org/wiki/Software
"tiện ích" cũng là phần mềm - phần mềm tiện ích. Phần mềm có nhiều nhánh khác nhau: phần mềm tiện ích, phần mềm hệ thống....etc(khái niệm phần mềm cũng rộng lớn...). Việc bán được hay không, không phụ thuộc vào đó là phần mềm tiện ích, phần mềm hệ thống, plugin, addon... Nó phụ thuộc vào tính hữu dụng, cạnh tranh, cá biệt của sản phẩm của bạn. Bạn hoàn toàn có thể đem bán...nhưng có bán được không lại là chuyện khác !

anrgymas
29-09-2005, 08:52 PM
Bac kthung oi! Bac đã chạy chưa mà bảo em load trên mạng về, addon này em tự viết hẳn hoi, bác dựa vào đâu mà nói thế. Em thấy các bác nên dùng thử và cho lời khuyên về kỹ thuật lập trình cho nó mang tính xây dựng một tý.
Hơn nữa em mới bập bẹ vào nghề mới được 1 tháng.

Hy vọng các bác ủng hộ em, việc bán là em muốn cảm thấy cái mình làm có giá trị gì đó.

kthung
03-10-2005, 11:09 AM
Mình chạy thử rồi mà. Thấy trên mạng có những mã nguồn giống như vậy ( *.fas) ở 1 trang contour mà. Còn tất nhiên các phần khác là bạn làm rồi.

anrgymas
04-10-2005, 12:49 PM
Vậy bác Kthung cho em xin ý kiến về cách chèn cao độ vào đường đồng mức đi. Hiện tại em mới chỉ làm chèn bằng tay. Còn nếu chèn tự động thì rất hay bị lỗi khi trim (do kích thước con trỏ to và zoom thì nhỏ).
Bác nào muốn sử dụng addin này cứ gửi mã cho em , em free luôn bản đầu.

kthung
05-10-2005, 01:25 PM
Bạn cứ chèn cao độ bình thường, đừng trim các đường đồng mức, vì sẽ rất khó khăn cho người sử dụng khi chọn cũng như quản lý. Còn text, có thể gắn với body ( lệnh textmark trong express) vẫn có thể che đi được phần đường đồng mức cần điền cao độ .

tanthanh
05-10-2005, 11:00 PM
Bác nào có chương trình dịch ngược *.fas thành *.lsp thì cho mình với địa chỉ mail hnhanthanh@yahoo.com

anrgymas
06-10-2005, 12:01 PM
To Kthung!
Cám ơn bác nhiều, em đã hiểu ý bác. Mong các bác giúp đỡ thêm nhiều.
Hiện tại em đang tìm tài liệu về API (.net) của AutoCAD 2006 bác nào có link thì send cho em với.

To tanthanh
Mình cũng đã từng tìm nhưng chưa thấy, bạn cứ cố mà tìm. Khi nào có thì báo cho mình một tiếng.

Kidsmart1981
06-10-2005, 03:24 PM
Mình có cuốn "Kidsmart's AutoCAD 2006 .NET APIs Total Reference" , cuốn này giá... 50$ bạn có mua không? :D

SupperMT
10-10-2005, 09:35 AM
Chào cả nhà,
Tớ gặp trường hợp này không biết bác nào biết thì giúp tớ nhé. Tớ viết xong một file lisp hoàn chỉnh, sau đó tớ cho load và cho chạy trên nền AutoCad2004, ngặc nổi, lênh của tớ chỉ chạy và vẽ tốt ở lần đầu tiên, đến lần thứ hai khi sử dụng nó thì nó cứ vẽ lung tung, không như lần 1 đã hoàn chỉnh, chỉ khi nào mở file mới, load file đó lại thì nó lại như ý mình, (tớ cũng thử trên AutoCad2000 cũng vẫn như cũ....!). Vậy các bác nào có kinh nghiệm về sự cố này tớ xin thọ giáo..

Cuong_gt41
10-10-2005, 09:39 AM
Bạn xem lại xem có dùng dữ liệu dạng mảng không.nếu dùng thì sau khi sử dụng xong phải xóa nó đi.

kthung
10-10-2005, 10:47 AM
Trường hợp này có thể có vài nguyên nhân, bạn thử kiểm tra 2 trường hợp sau :
- Khai báo các biến : nếu 1 lệnh không dùng các biến toàn cục thì phải khai báo là biến cục bộ
- Kiểm tra chế độ bắt điểm.

kthung
10-10-2005, 02:05 PM
Trong dữ liệu của lisp không có kiểu mảng đâu, chỉ có list thay mảng thôi. Nhưng các biến trong Lisp đều tự động xóa khỏi bộ nhớ khi thực hiện xong lệnh, trừ các biến toàn cục.

anrgymas
11-10-2005, 05:40 PM
to Kidsmart1981
Sách bác giới thiệu 50$ kể cũng đắt thật đấy em chịu không mua nổi. Vậy bác kiếm nó ở đâu vậy. Ngoài ra bác còn tài liệu nào về NET CAD có thể miễn phí thì giới thiệu cho đàn em cùng học tập với.

Kidsmart1981
11-10-2005, 06:05 PM
Đấy là tôi trêu bạn thôi(mà bán 50 phiên bản NS thì thừa tiến ấy chứ :D). Trong đây có một topic về ObjectARX rồi đó, bạn sẽ tìm thấy một số link hữu ích trong đó.
Have fun!

KSVinhBK99
22-10-2005, 01:02 PM
Em có đaọn lisp sau dùng để đưa các đường kích thước về cùng một lớp "Dim" trong
bản vẽ Autocad. Nhưng không hiểu sao các đường kích thước được tạo ra không nằm ở
lớp Dim mà nằm ở lớp hiện hành. Các bác giúp em với.
;;; chuong trinh dua cac dimension ve lop "dim"
(defun C:dd ( )
(setq olderr *error*
*error* myerror)
(setq ocmd (getvar "cmdecho"))
(setq osme (getvar "osmode"))
(setvar "cmdecho" 0)
(setq olay (getvar "clayer"))
(command "clayer" "DIM")
(command "_dimlinear")
(setvar "clayer" olay)
(setvar "cmdecho" ocmd)
(setvar "osmode" osme)
(setq *error* olderr)
(princ)
;)
;;;
;;; ====================== END OF FUNCTION "dimlinear"

kthung
25-10-2005, 02:30 PM
Các đường kích thước được tạo không nằm ở lớp hiện hành là vì lệnh : (command "_dimlinear") thực hiện sau cùng, sau cả hàm gọi : (setvar "clayer" olay).

kthung
25-10-2005, 02:35 PM
lệnh gọi (command "_dimlinear") còn thiếu mất 3 đối số. Bạn thử thay nó bằng (command "_dimlinear" PAUSE PAUSE PAUSE) thử xem. Đây là cách thử thô thiển nhất.
Cách bạn tạo dim bằng lệnh command không chuyên lắm. Tạo bằng mã DXF hoặc VisualLisp Automation tốt hơn. Chúc thành công.

nglam_adg
26-10-2005, 01:08 AM
Em có đaọn lisp sau dùng để đưa các đường kích thước về cùng một lớp "Dim" trong
bản vẽ Autocad. Nhưng không hiểu sao các đường kích thước được tạo ra không nằm ở
lớp Dim mà nằm ở lớp hiện hành. Các bác giúp em với.
;;; chuong trinh dua cac dimension ve lop "dim"
(defun C:dd ( )
(setq olderr *error*
*error* myerror)
(setq ocmd (getvar "cmdecho"))
(setq osme (getvar "osmode"))
(setvar "cmdecho" 0)
(setq olay (getvar "clayer"))
(command "clayer" "DIM")
(command "_dimlinear")
(setvar "clayer" olay)
(setvar "cmdecho" ocmd)
(setvar "osmode" osme)
(setq *error* olderr)
(princ)
;)
;;;
;;; ====================== END OF FUNCTION "dimlinear"
Vì DIM_Command là một cấu trúc tổ hợp phức tạp kiểu Phả hệ (gồm nhiều lệnh nhánh) nên không dùng theo kiểu (command "_.Dim..." ...) được. Lệnh Dim nếu muốn dùng với hàm command thì phải cung cấp đủ tham số chứ không dùng được dạng mở (kiểu Pause như kthung nói).
Theo tôi, bạn thử cách này xem:

(defun C:dd (/ olay)
(setq olderr *error*
*error* myerror
olay (getvar "Clayer"))
(Dimlay "Dim")
(setvar "Clayer" "Dim")
(command "_Dimlinear")
(setq *error* olderr)
)
;;; Kiểm tra - Khởi tạo Layer "Dim" nếu chưa có trên bản vẽ
(defun Dimlay (layr_name / tbl t1 t2 keyl)
(setvar "Cmdecho" 0)
(setq tbl (tblnext "LAYER" 1))
(while tbl
(setq t1 (strcase layr_name)
t2 (strcase (cdr(car(cdr tbl))) ) )
(if(equal t1 t2)(setq keyl 1)(setq keyl NIL))
(setq tbl (tblnext "LAYER"))
)
(if(/= keyl 1)
(command "_.LAYER" "N" layr_name "") )
(setq layr_name NIL)
(princ)
)

luunhieu
26-10-2005, 08:31 PM
(setq olderr *error*
*error* myerror
)
(setq *error* olderr)

Xin vui lòng giải thích dùm mấy cái khai báo biến *error*, em không hiểu tác dụng của nó! mà thấy nhiều người viết nó, không biết câu lệnh đó làm việc như thế nào? :confused:

nglam_adg
27-10-2005, 12:29 AM
(setq olderr *error*
*error* myerror
)
(setq *error* olderr)

Xin vui lòng giải thích dùm mấy cái khai báo biến *error*, em không hiểu tác dụng của nó! mà thấy nhiều người viết nó, không biết câu lệnh đó làm việc như thế nào? :confused:
Đây là hàm bắt lỗi chương trình trong trường hợp chương trình bị dừng không đúng quy trình (Esc - Exit).
Cấu trúc đầy đủ là:
(defun MyErr (msg)
(if (or
(= msg "Function cancelled")
(= msg "console break")
(= msg "quit / exit abort") )
(princ)
(princ (strcat "\nError: " msg))
)
...
(defun .... ()
(setq old_err *error*
*error* MyErr)
...
(setq *error* old_err)
)

Hàm trên sẽ thông báo lỗi gặp phải và dừng chương trình ngay lập tức, đồng thời giải phóng biến hoặc hàm gây lỗi.

Tran Duc Minh
28-11-2005, 12:40 PM
Em đang thắc mắc 1 chút, mong các anh chỉ dùm em:
Giả sử trong bản vẽ Cad em tạo 1 định nghĩa thuộc tính 1 Block "cao độ", em đã ghi các cao độ tại các điểm vào 1 bản vẽ. Bây giờ vì cao độ mốc giả định bị thay đổi lên 0.3 -> tất cả các cao độ tại các điểm khác thay đổi theo. Vậy những lệnh nào của Lisp giúp em có thể lấy ra được những thuộc tính của các Block ra rồi cộng thêm 1 lượng 0.3 nữa?

Em mò hoài mà ko biết, mong các anh giải nghĩa cụ thể từng dòng để em nắm được cách thức làm.

nglam_adg
28-11-2005, 07:07 PM
Em đang thắc mắc 1 chút, mong các anh chỉ dùm em:
Giả sử trong bản vẽ Cad em tạo 1 định nghĩa thuộc tính 1 Block "cao độ", em đã ghi các cao độ tại các điểm vào 1 bản vẽ. Bây giờ vì cao độ mốc giả định bị thay đổi lên 0.3 -> tất cả các cao độ tại các điểm khác thay đổi theo. Vậy những lệnh nào của Lisp giúp em có thể lấy ra được những thuộc tính của các Block ra rồi cộng thêm 1 lượng 0.3 nữa?

Em mò hoài mà ko biết, mong các anh giải nghĩa cụ thể từng dòng để em nắm được cách thức làm.

Nếu Block chỉ có 1 thuộc tính (attribute) thì khá đơn giản. Có một vài cách để làm việc này. Cách đơn giản nhất là lấy thuộc tính của Block (bằng mã DXF) sau đó thay đổi thành giá trị mới rồi cập nhật lại mã DXF đó vào đối tượng. Nếu muốn thay đổi một loạt - tức là tất cả giá trị cùng cộng hay trừ đi 1 số không đổi thì phải làm thêm 1 đoạn mã điều kiện lọc (cái nào cần cộng, cái nào không).
Dưới đây là đoạn mã lọc lấy giá trị phần thuộc tính (Attribute Tag) của 1 block. Bạn có thể phát triển thêm theo yêu cầu cụ thể.
Lưu ý, tên và giá trị các mã DXF có phân biệt chữ hoa và chữ thường.

(defun C:COT (/ blo_ch att blo_fd attdata s_hieu)
(setvar "Cmdecho" 0)
(setq blo_ch (entsel "\nPick Chon cot sua: "))
(if blo_ch
(progn
(setq blo_fd (entget (car blo_ch))
att (entnext (car blo_ch)))
(progn
(setq attdata (entget att))
(if (= (cdr (assoc 0 attdata)) "ATTRIB")
(progn
(setq label (cdr (assoc 2 attdata)))

(if(= (strcase label) "COT")
;Tên Attribute Tag của đối tượng là "COT"
(setq s_hieu (cdr (assoc 1 attdata))))
)
)
);progn
(princ "\nCot: ") (princ s_hieu)
)
)
)

Để thử đoạn mã trên, bạn tạo 1 Block (kiểu ký hiệu ghi cốt chẳng hạn), có 1 thuộc tính. Tên nhãn thuộc tính (Attribute Tag) là "COT". Khi chạy lệnh COT, bấm vào Block trên, bạn sẽ có giá trị cốt cao độ cần lấy (biến s_hieu).

Chúc thành công !

HungCraper
04-12-2005, 11:06 PM
Sorrrrrry cac baccc!
E thay bac TaoTao395 noi cung co cai dung, ma bac Robinho gi do noi cung dung. Nhung em man phep cac bac the nay! Thoi thi ta manh cai gi thi ta lam cai day. Tot nhat la phat trien song song cung voi cong nghẹ Bac nao di truoc cong nghe thi cung kho vi moi nguoi dau co dung duoc cai ma bac vua lam ra lai phai thay doi ca 1 he thong keo theo no. Nhung bac nao bao thu qua thi cung khong duoc!! :p Vi moi nguoi chay ve dich het roi ma bac van let det o xa thi cung khong xong.
Bac TaoTao395 lap co so du lieu tren Exel roi chuyen sang cho anh CAD cung hay, Tui co nghien cưu EXel cung kha nhieu tu Version 3- 4 co no dung la bang tinh van nang day, nhung co cai la neu ma su dung khong quen thi hay bi co van de lam! Bac cung nen chuyen dan sang cai khac di, Exel tot nhat la phat trien ve Thong Ke va xu ly bieu do thoi, chu de tao co so du lieu cho cad thi lau lam va phai qua nhieu cong doạn Bac nen nghien cưu them 1 so mon nhu C,C++ hay cu chuoi thi dung Pascal nhu cac cu ta cung duoc cung nhanh lam ma xuat File chinh xac hon anh Exel cua bac nhieu. Ma neu co thoi gian thi bac dung VB thi cang hay, trong vua khoa hoc ma lai cho nhieu nguoi su dung de dang. Kien thuc la cua nhan loai ma cung nen chia xe cho moi nguoi chu.....Hehe.
Thoi gian sau em se Post cho cac bac may cai Lisp cua em, nhung chi choi boi va tham khao thui, chu yeu phuc vu cho dan DCCT thui con cac bac ket cau thi SUPER rui em khong dam ban toi...

thuer
19-12-2005, 12:58 PM
Đây là hàm bắt lỗi chương trình trong trường hợp chương trình bị dừng không đúng quy trình (Esc - Exit).
Cấu trúc đầy đủ là:
(defun MyErr (msg)
(if (or
(= msg "Function cancelled")
(= msg "console break")
(= msg "quit / exit abort") )
(princ)
(princ (strcat "\nError: " msg))
)
...
(defun .... ()
(setq old_err *error*
*error* MyErr)
...
(setq *error* old_err)
)

Hàm trên sẽ thông báo lỗi gặp phải và dừng chương trình ngay lập tức, đồng thời giải phóng biến hoặc hàm gây lỗi.

Anh lâm ơi em viết Lisp và sửa lỗi, lúc chạy và ngắt lỗi vẫn tốt nhưng có một lỗi xảy ra là sẽ mất chế độ bắt điểm nếu người dùng undo lại lệnh vừa thục hiện. Anh có cách chỉ giúp.

nglam_adg
22-12-2005, 12:22 AM
Với AutoLisp, có 3 cách gán thuộc tính hệ thống cho việc bắt điểm:
- Gán thông qua hàm lệnh command.
- Gán trực tiếp (bằng hàm osnap).
- Gán toàn cục (bằng hàm setvar).
Cách thứ nhất rất dẽ bị mất thuộc tính - không nên dùng.
Cách thứ 2 chỉ nên dùng khi đối tượng chọn có vị trí xác định.
Cách thứ 3 linh hoạt và "chuyên nghiệp" nhất. Thông thường, khi viết các hàm lệnh (defun), chúng ta thường gán thuộc tính cho biến hệ thống ngay từ đầu hàm lệnh và chỉ trả lại giá trị ban đầu khi kết thúc hàm lệnh đó. Cách viết này ngắn gọn và đơn giản, dễ quản lý nhưng nhược điểm là sẽ mất thuộc tính của biến hệ thống nếu dùng lệnh Undo. Tốt nhất, chỉ gán thuộc tính hệ thống khi cần và trả lại giá trị ngay sau khi thực hiện xong tác vụ.
VD:
(setq old_osm (getvar "Osmode")) ; Lấy giá trị bắt điểm hiện thời.
(setvar "Osmode" (+ 1 2 4)) ; Đặt bắt điểm = End+Mid+Cen.
(command ......)
(setvar "Osmode" old_osm) ; Trả lại giá trị ban đầu.

thuer
24-12-2005, 08:46 AM
Với AutoLisp, có 3 cách gán thuộc tính hệ thống cho việc bắt điểm:
- Gán thông qua hàm lệnh command.
- Gán trực tiếp (bằng hàm osnap).
- Gán toàn cục (bằng hàm setvar).
Cách thứ nhất rất dẽ bị mất thuộc tính - không nên dùng.
Cách thứ 2 chỉ nên dùng khi đối tượng chọn có vị trí xác định.
Cách thứ 3 linh hoạt và "chuyên nghiệp" nhất. Thông thường, khi viết các hàm lệnh (defun), chúng ta thường gán thuộc tính cho biến hệ thống ngay từ đầu hàm lệnh và chỉ trả lại giá trị ban đầu khi kết thúc hàm lệnh đó. Cách viết này ngắn gọn và đơn giản, dễ quản lý nhưng nhược điểm là sẽ mất thuộc tính của biến hệ thống nếu dùng lệnh Undo. Tốt nhất, chỉ gán thuộc tính hệ thống khi cần và trả lại giá trị ngay sau khi thực hiện xong tác vụ.
VD:
(setq old_osm (getvar "Osmode")) ; Lấy giá trị bắt điểm hiện thời.
(setvar "Osmode" (+ 1 2 4)) ; Đặt bắt điểm = End+Mid+Cen.
(command ......)
(setvar "Osmode" old_osm) ; Trả lại giá trị ban đầu.

Cám ơn anh Lam nhiều. Chúc anh giáng sinh vui vẽ và một năm mới với nhiều thành công mới.

HOÀNG TRUNG HẬU-00X3C
29-12-2005, 01:11 PM
Em mới tập tành học VL. Em xem 1 đoạn ví dụ nhưng không hiểu:
(command ".line" "tan" PT1 PT2 )
với PT1, PT2 là các điểm nối. Em không hiểu là sau lệnh Line tại sao lại có thêm lựa chọn "Tan", trong CAD làm gì có? (đây là 1 đoạn trong chương trình vẽ đường thẳng tiếp xúc 2 đường tròn, rồi trim đi phần đường tròn bên trong)
Các anh gỡ giúp!

nglam_adg
29-12-2005, 01:48 PM
Em mới tập tành học VL. Em xem 1 đoạn ví dụ nhưng không hiểu:
(command ".line" "tan" PT1 PT2 )
với PT1, PT2 là các điểm nối. Em không hiểu là sau lệnh Line tại sao lại có thêm lựa chọn "Tan", trong CAD làm gì có? (đây là 1 đoạn trong chương trình vẽ đường thẳng tiếp xúc 2 đường tròn, rồi trim đi phần đường tròn bên trong)
Các anh gỡ giúp!
"tan" là tham số cho lựa chọn "Tangent" (tiếp tuyến) trong phần bắt điểm đối tượng. Đây là cách đặt bắt điểm trực tiếp.

Ksvtuan
11-04-2006, 04:02 PM
Anh Nguyễn Lam chỉ Cho em cách viết mã Lệnh cho nút <-Prev và Next->
để bật qua lại cho các nút Image-button.
Em viết chương trình thống kê thép như bản nhập liệu em không biết mã lệnh cho hai nút đó.
Chỉ dùm em nhe

nglam_adg
13-04-2006, 01:20 AM
Anh Nguyễn Lam chỉ Cho em cách viết mã Lệnh cho nút <-Prev và Next->
để bật qua lại cho các nút Image-button.
Em viết chương trình thống kê thép như bản nhập liệu em không biết mã lệnh cho hai nút đó.
Chỉ dùm em nhe
Vì câu hỏi của bạn không cụ thể nên tôi chỉ có thể trả lời khái quát.

Có ít nhất 2 trường hợp cho cụm Next-Prev:
1- Số lượng và tên Image_button trên dialog xác định - tức là luôn cố định, không thay đổi về số lượng.
2- Số lượng và tên Image_button trên dialog không xác định - tức là có thể tăng lên hoặc giảm đi khi người dùng bổ xung, thay đổi cơ sở DL.

Trường hợp 1:
- Yêu cầu:
Khi ở trang thứ nhất, nút Prev phải không tác động được (mờ đi). Ngược lại, khi ở trang cuối cùng, nút Next cũng sẽ bị mờ đi.
Khi đang ở trang đầu, cụm Next-Prev có cấu trúc:
(if(= page 1) (progn (mode_tile "next" 0)(mode_tile "prev" 1)));if
- Nguyên tắc hoạt động:
Khi nhấn vào Next, các tên Image_button hiện tại sẽ được công thêm 1 số bằng số lượng các Image_button hiển thị. Có nghĩa là tên Image tương ứng với giá trị "key" của Image_button sẽ được thay bằng tên mới có giá trị = (tên cũ + số lượng Image_button hiển thị). Ví dụ có 6 image_button hiển thị thì khi nhấn next, Image ở vị trí số 1 sẽ được thay bằng image 7, image 2 sẽ được thay bằng image 8 ...
Như vậy ta chỉ cần tạo 1 hàm lệnh cục bộ để thay đổi Image và gán hàm đó cho nút lệnh.
Với nút Prev thì ngược lại. Lưu ý chung là phải chốt điểm đi và điểm đến của 2 nút Next và Prev vì nếu không vòng lặp sẽ trở nên vô cùng và bạn sẽ không thể trở về trang đầu được.

Trường hợp 2:
Phức tạp hơn trường hợp vì có sự thay đổi về số lượng các image trong CSDL. Lúc này, bạn cần phải có thêm 1 hàm lệnh kiểm tra số lượng Image trong CSDL sau đó so sánh nó với số Image_button hiển thị. Nếu số Image_button lớn hơn số image trong CSDL thì cả 2 nút Next và Prev đều phải mất tác dụng. Nếu số Image lớn hơn số Image_button thì cần kiểm tra xem chúng có chia hết cho nhau không vì nếu lẻ sẽ dẫn đến có nút trống (không có Image) nhưng chương trình vẫn tiến hành gán "Action_tile" cho nút đó và gây lỗi nếu vô tình bấm nhầm hoặc báo lỗi ngay khi load_dialog.

Trong TKXD30, chương trình Thống kê thép, Thư viện dữ liệu là trường hợp 2. Chương trình Vẽ + thống kê thiết bị điện là trường hợp 1.

RNDCE
28-04-2006, 04:30 PM
Anh Lâm kiểm tra xem dùm em đoạn lisp dưới đây
Mục đích của em là :
Từ một hình chữ nhật có sẵn trên bản vẽ với hai cạnh là L1, L2 -> cần tạo ra một hình chữ nhật mới nằm bên trong hình chữ nhật cũ với các cạnh là (L1-2d, L2-2d) trong đó d=min(0.25L1, 0.25L2). Em chạy đoạn lisp trên thì kết quả cho ra tọa độ 3D của một điểm, không tạo được hình chữ nhât.

(defun c:rt ()
(setq olderr *error*
*error* myerror)
(setq pt1 (getpoint "\nFirst point of rectangle..."))
(setq pt2 (getpoint pt1 "\nCorner of rectangle..."))
(setq a(angle pt1 pt2)
dis(distance pt1 pt2))
(setq co (* dis (cos a))
si (* dis (sin a)))
(setq delta (min (* 0.25 co) (* 0.25 si)))
(setq pta (polar pt1 (* 0.25 pi) (* delta (cos (/ pi 4)) ))) )
(setq ptb (polar pta (/ pi 2.0) (- si (* 2 delta))) )
(setq ptc (polar ptb 0 (- co (* 2 delta))) )
(setq ptd (polar pta 0 (- co (* 2 delta))) )
(command "_.pline" pta ptb ptc ptd "c")
(setq *error* olderr)
(princ)
)

nglam_adg
29-04-2006, 12:02 AM
Anh Lâm kiểm tra xem dùm em đoạn lisp dưới đây
Mục đích của em là :
Từ một hình chữ nhật có sẵn trên bản vẽ với hai cạnh là L1, L2 -> cần tạo ra một hình chữ nhật mới nằm bên trong hình chữ nhật cũ với các cạnh là (L1-2d, L2-2d) trong đó d=min(0.25L1, 0.25L2). Em chạy đoạn lisp trên thì kết quả cho ra tọa độ 3D của một điểm, không tạo được hình chữ nhât.

(defun c:rt ()
(setq olderr *error*
*error* myerror)
(setq pt1 (getpoint "\nFirst point of rectangle..."))
(setq pt2 (getpoint pt1 "\nCorner of rectangle..."))
(setq a(angle pt1 pt2)
dis(distance pt1 pt2))
(setq co (* dis (cos a))
si (* dis (sin a)))
(setq delta (min (* 0.25 co) (* 0.25 si)))
(setq pta (polar pt1 (* 0.25 pi) (* delta (cos (/ pi 4)) ))) )
(setq ptb (polar pta (/ pi 2.0) (- si (* 2 delta))) )
(setq ptc (polar ptb 0 (- co (* 2 delta))) )
(setq ptd (polar pta 0 (- co (* 2 delta))) )
(command "_.pline" pta ptb ptc ptd "c")
(setq *error* olderr)
(princ)
)
Tôi đã thử chạy đoạn mã trên, ngoài 1 lỗi nhỏ là thừa 1 dấu ")" ở dòng thứ 11 ra thì không có vấn đề gì. Sau khi chạy thì được kết qủa như hình dưới.

Đồng Viết Thiện
03-05-2006, 01:27 PM
Đây là 1 chương trình nhỏ do mình viết để tự dùng lấy, CT này dùng để hỗ trợ triển khai bản vẽ KC. Mong các bạn xài thử và cho ý kiến, mình kg viết được bộ cài đặt cho nên các bạn chịu khó tự cài lấy (đoc nội dung từ file huongdan.txt). Thank.

Tu ACC
04-05-2006, 03:00 PM
Cam on ban Dong Viet Thien da dua len dien dan mot chuong trinh hay. Toi down ve va cai nhu trong huong dan nhung chua su dung duoc, ban co the huong dan ky hon khong? Hinh nhu chuong trinh con thieu mot so file nao do ban a!Rat mong ban hoi am som.Thank!

Đồng Viết Thiện
06-05-2006, 01:10 PM
Cam on ban Dong Viet Thien da dua len dien dan mot chuong trinh hay. Toi down ve va cai nhu trong huong dan nhung chua su dung duoc, ban co the huong dan ky hon khong? Hinh nhu chuong trinh con thieu mot so file nao do ban a!Rat mong ban hoi am som.Thank!

không biết bạn bị kẹt ở đâu? Ở khâu cài đặt hay khâu sử dụng, bạn phải nói rõ hơn. Nhưng có ma71y điều cần chú ý như sau:
1- Phải khởi động lại CAD sau khi cài đặt.
1- Hầu như tất cả các lệnh trong Menu "Ket Cau" chỉ thực hiện được sau khi bạn thực hiện động tác này 01 lần duy nhất là: "Khoi tao ban ve" trong menu "Ket Cau". Chúc bạn Thành Công.

Đồng Viết Thiện
13-05-2006, 01:26 PM
File hướng dẫn cài đặt & sử dụng FASTCAD dạng *.pdf ver7.0.

HOÀNG TRUNG HẬU-00X3C
18-05-2006, 01:06 PM
Em dang moi bat dau VLisp và tập tành một số hàm đơn giản. Em dang viet 1 vi dụ nhỏ tính diện tích 1 hình bất kì bao bởi các đường line bằng cách kích 1 điểm phía trong nó nhưng không hiểu sao em làm như dưới mà vần ko được:confused: .
;Tinh dien tich cua 1 hinh bao
(defun c:dti (/ p1)
(setvar "cmdecho" 0)
(setq p1 (getpoint "Chon diem trong vung can tinh dien tich:"))
(command ".boundary" p1
".area" "o" "last" )
(princ)
)
Các bác giúp em với nha:) . Mà em thấy hình như không thực hiện 2 lệnh khác nhau liên tiếp được thì phải:rolleyes: .

PhanTuHuong
18-05-2006, 07:40 PM
Trước kia tôi cũng dùng AutoLisp cho công việc mình. Tuy nhiên những dấu mở ngoặc, đóng ngoặc làm nhức hết cả đầu, không biết tìm sai ở đâu. Không hiểu Visual Lisp có khác gì không?!
Bây giờ đã có VBA trong AutoCad rồi, tôi nghĩ đi theo con đường này hợp lý và phổ biến hơn cả.

nglam_adg
19-05-2006, 12:59 AM
Em dang moi bat dau VLisp và tập tành một số hàm đơn giản. Em dang viet 1 vi dụ nhỏ tính diện tích 1 hình bất kì bao bởi các đường line bằng cách kích 1 điểm phía trong nó nhưng không hiểu sao em làm như dưới mà vần ko được:confused: .
;Tinh dien tich cua 1 hinh bao
(defun c:dti (/ p1)
(setvar "cmdecho" 0)
(setq p1 (getpoint "Chon diem trong vung can tinh dien tich:"))
(command ".boundary" p1
".area" "o" "last" )
(princ)
)
Các bác giúp em với nha:) . Mà em thấy hình như không thực hiện 2 lệnh khác nhau liên tiếp được thì phải:rolleyes: .
Bạn bị thiếu 1 dấu nháy kém ("") ở cuối dòng gọi lệnh ".boundary" nên nó không chạy được chứ không phải không thực hiện được 2 lệnh liên tiếp.
Lệnh của bạn có thể sửa như dưới đây là chạy. Tôi có bổ xung thêm phần lấy chu vi luôn - đằng nào cũng một công viết.

(defun c:dti (/ p1 old_bou obj_area)
(setvar "cmdecho" 0)
(setq old_bou (getvar "Hpbound") obj_area NIL)
(setq p1 (getpoint "Chon diem trong vung can tinh dien tich:"))
(setvar "Hpbound" 1)
(command "_.Undo" "mark")
(command ".boundary" p1 "")
(setq obj_area(ssget "L"))
(if(= (cdr (assoc 0 (entget (ssname obj_area 0)) )) "LWPOLYLINE")
(progn
(command ".area" "o" obj_area)
(princ (strcat "\nChu vi : " (rtos (getvar "Perimeter") 2 3)))
(princ (strcat "\nDien tich: " (rtos (getvar "Area") 2 3)))
(command "_.Undo" "Back")
);progn
);if
(setvar "Hpbound" old_bou)
(princ)
)

Phần in nghiêng + đậm là phần tôi viết thêm vào lệnh của bạn.

HOÀNG TRUNG HẬU-00X3C
19-05-2006, 01:22 PM
Bạn bị thiếu 1 dấu nháy kém ("") ở cuối dòng gọi lệnh ".boundary" nên nó không chạy được chứ không phải không thực hiện được 2 lệnh liên tiếp.
Cái này em đã thử thêm dấu nháy rồi mà cũng chỉ thực hiện được boundary, còn area thì không thực hiện:confused: .
Có phải khi mình viết 1 đoạn chương trình mà thay đổi các biến hệ thống thì kết thúc phải trả lại đúng giá trị cũ không. Vì em thấy anh Lam đưa biến old_bou, nhưng em không biết vì sao anh lại chuyển giá trị Hpbound=1, hay là nếu giá trị =0 (tức là miền) thì không chọn được. Em lại thấy anh dùng lệnh undo lại rất nhiều, không biết có phải là sau khi tạo được đa tuyến bao kín thì đưa nó về lại nguyên trạng bản vẽ, mà "mark" là gì thế anh? Trước undo có dấu gạch thì theo em là để chuyển ngôn ngữ, ngoài ra còn tác dụng gì ko? Anh giải thích giùm em câu này nha:D :
(if(= (cdr (assoc 0 (entget (ssname obj_area 0)) )) "LWPOLYLINE")
Em đang thử viết thêm 1 đoạn để tính diện tích nhiều hình cùng 1 lúc. Lúc nào viết xong em sẽ đưa lên nhờ các anh chỉnh giúp:)

HOÀNG TRUNG HẬU-00X3C
19-05-2006, 01:30 PM
Trước kia tôi cũng dùng AutoLisp cho công việc mình. Tuy nhiên những dấu mở ngoặc, đóng ngoặc làm nhức hết cả đầu, không biết tìm sai ở đâu. Không hiểu Visual Lisp có khác gì không?!
Bây giờ đã có VBA trong AutoCad rồi, tôi nghĩ đi theo con đường này hợp lý và phổ biến hơn cả.
Dùng VBA nghe có vẽ dễ hơn Vlisp (dù chưa bao giờ dùng tới:D ), vì em cũng có dùng VBA cho Excel. Cái Vlisp viết giống như C+(em nghe nói thôi), vì thấy viết hộp thoại trong Vlisp mà phải viết từng nút một, ko biết VBA trong cad có tạo hộp thoại dễ dàng như VBA trong Excel không? Nếu thế thì tốt quá.
Nhưng dù sao thì cũng phải dùng Vlisp bởi ở em còn dùng cad14 nên ko dùng được loại này:o . Bác có viết VBA nào cho cad chưa đưa lên cho anh em xem với.

PhanTuHuong
19-05-2006, 11:59 PM
VBA ứng dụng trong AutoCad có giao diện giống như trong Excel. Bạn có thể thiết kế các bảng điều khiển (form), trên form có thể tạo các nút command, label, combobox, textbox, optionbutton,... bằng tay (rất dễ). Sau đó gán các thuộc tính và chương trình chạy cho mỗi đối tượng. Bạn không phải thiết kế từng đối tượng như ở Autolisp đâu.

Nói chung, VBA không khó học, đặc biệt là người có tư duy về lập trình.
Để biết thêm bạn vào google "VBA in AutoCad", cả một kho bạn tha hồ nghiên cứu.

nglam_adg
20-05-2006, 12:15 AM
Cái này em đã thử thêm dấu nháy rồi mà cũng chỉ thực hiện được boundary, còn area thì không thực hiện:confused: .
Có phải khi mình viết 1 đoạn chương trình mà thay đổi các biến hệ thống thì kết thúc phải trả lại đúng giá trị cũ không. Vì em thấy anh Lam đưa biến old_bou, nhưng em không biết vì sao anh lại chuyển giá trị Hpbound=1, hay là nếu giá trị =0 (tức là miền) thì không chọn được. Em lại thấy anh dùng lệnh undo lại rất nhiều, không biết có phải là sau khi tạo được đa tuyến bao kín thì đưa nó về lại nguyên trạng bản vẽ, mà "mark" là gì thế anh? Trước undo có dấu gạch thì theo em là để chuyển ngôn ngữ, ngoài ra còn tác dụng gì ko? Anh giải thích giùm em câu này nha:D :

Em đang thử viết thêm 1 đoạn để tính diện tích nhiều hình cùng 1 lúc. Lúc nào viết xong em sẽ đưa lên nhờ các anh chỉnh giúp:)
1. Biến hệ thống trong AutoCAD có tác dụng điều khiển và xác lập môi trường tương tác với đối tượng và giao diện. Trong một số trường hợp, biến môi trường còn quyết định tính chất đối tượng. Vì thế, tốt nhất là trả lại giá trị ban đầu cho nó sau khi dùng xong.

2. Tôi dùng lệnh undo để khôi phục lại lại nguyên trạng bản vẽ như trước khi lệnh boundary tác động vào. Còn "mark" là để đánh dấu mốc undo.

3. Dấu ngạch dạng "_." không phải để chuyển ngôn ngữ (bạn nhầm sang dấu trừ "-"). Có rất nhiều lệnh được viết cho AutoCAD bằng các ngôn ngữ khác nhau. Thậm chí có người viết lệnh mới trùng tên với lệnh gốc của AutoCAD. Để khắc phục tình trạng trùng lệnh, biến... (tạo vòng lặp vô tận dẫn đến tràn bộ đệm), trước mỗi lệnh được gọi, ta thêm vào cụm dấu "_.". Như vậy, chương trình sẽ chỉ gọi lệnh nguyên bản của AutoCAD cho dù có hàng tá lệnh khác trùng tên với nó đang hoạt động.

4. Dòng :(if(= (cdr (assoc 0 (entget (ssname obj_area 0)) )) "LWPOLYLINE") có thể hiểu như sau:
obj_area là đối tượng (Pline) được tạo bằng lệnh boundary. Hàm entget sẽ lấy ra phần cơ sở dữ liệu của đối tượng (thể hiện ở dạng list). Đối tượng Pline có tên định danh là "LWPOLYLINE". Hàm assoc sẽ truy xuất danh sách cơ sở dữ liệu của đối tượng và so sánh xem đối tượng có phải "LWPOLYLINE" tức Pline không (Tên đối tượng có mã DXF nhóm 0 trong danh sách CSDL). Ở trên, tôi đã gán biến hệ thống "Hpbound" = 1 tức là đối tượng được tạo ra sẽ là Pline. Nếu không tìm được Pline đó, chương trình sẽ dừng.
Về cái này, bạn nên tìm hiểu thêm về mã đối tượng DXF. AutoLisp chỉ thực sự mạnh khi biết khai thác cơ sở dữ liệu đối tượng (DXF).

Lệnh AREA nhập từ bàn phím hoặc trên menu sẽ hiển thị kết quả và lưu vào biến hệ thống. Lệnh AREA được gọi vào từ hàm command thì chỉ lưu kết quả vào biến hệ thống. Như vậy nếu muốn hiển thị kết qủa, bạn phải gọi biến hệ thống đó ra (getvar "Area"). Bạn thêm dấu ("") vào nhưng không được là vì lý do trên.

HOÀNG TRUNG HẬU-00X3C
12-06-2006, 01:09 PM
Em dùng hàm ssget để chọn một đường thẳng, sau đó em muốn lấy điểm đầu và cuối đoạn thẳng đó. Em đã dùng kết hợp các hàm như sau: (card (assoc '10 (entget (ssget)))): lấy ra tọa độ x nhưng không được:o , hình như nó chỉ áp dụng cho loại enname là entnext.
Mong các bác giúp em, lấy ra tọa độ theo kiểu này. Em xin cám ơn!:)

tien2005
12-06-2006, 03:28 PM
Em dùng hàm ssget để chọn một đường thẳng, sau đó em muốn lấy điểm đầu và cuối đoạn thẳng đó. Em đã dùng kết hợp các hàm như sau: (card (assoc '10 (entget (ssget)))): lấy ra tọa độ x nhưng không được:o , hình như nó chỉ áp dụng cho loại enname là entnext.
Mong các bác giúp em, lấy ra tọa độ theo kiểu này. Em xin cám ơn!:)
Bạn thử sử dụng hàm này xem có giải quyết được vấn đề của bạn chưa?
(DEFUN C:tdo()
;chỉ chọn các đối tượng LINE
(SETQ ALIST (entget (ssname (SSGET) 0))
x0 (CADR (ASSOC 10 ALIST))
y0 (car(CddR (ASSOC 10 ALIST)))
x1 (CADR (ASSOC 11 ALIST))
y1 (car(CddR (ASSOC 11 ALIST)))
)
(princ (strcat "\nx0 : " (rtos x0 2 3)))
(princ (strcat "\ny0 : " (rtos y0 2 3)))
(princ (strcat "\nx1 : " (rtos x1 2 3)))
(princ (strcat "\ny1 : " (rtos y1 2 3)))
(princ)
)

HOÀNG TRUNG HẬU-00X3C
15-06-2006, 01:02 PM
Cảm ơn bác Tien2005! Ở nhà, em dùng hàm ssnamex (đúng ra phải dùng ssname) hèn chi không được:confused: . Mà vì sao bác không khai báo biến mà vẫn chạy được, em học qua sách thấy phải cần khai báo mà, thấy bác chỉ cần () là xong:eek: ! Hay thật! Học hỏi được các bác cao thủ em loé sáng nhiều ý tưởng, rất cảm ơn các bác!:)

HOÀNG TRUNG HẬU-00X3C
23-06-2006, 01:02 PM
Em đang triển khai viết chương trình vẽ 1 số chi tiết (phần insert em chưa biết dùng thế nào), nhưng không hiểu sao vừa viết ra thì tự động vẽ đúng như ý tưởng mình viết nhưng sau 1 vài lần thì nó lại vẽ không theo ý tưởng mình viết. Lúc đầu, em nghĩ là do em ko khai báo biến nên nó có thể trùng vào biến toàn cục của ACAD nên khai báo lại rồi cũng chỉ được vài lần đầu, lần sau lại bị. Em đã đem thử máy khác nhưng vẫn bị hiện tượng trên. Các bác cao thủ giúp em giải quyết vụ này nha! Em cảm ơn!:)

HOÀNG TRUNG HẬU-00X3C
23-06-2006, 01:11 PM
Hơi rườm rà vì em mới học (ko tải file được nên copy thể này, các bác thông cảm):
;Ve chan khay va gia co mai ta luy
(defun c:taluy (/ ss Alist x0 y0 x1 y1 b1 b2 b3 h1 h2 htl mid donvi ble le Alist1 xx yy xx1 yy1 goc gle a b c d x2 y2 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 pt13 pt14 pt15 pt16 pt17 pt18 pt19 pt20 pt21)
(setvar "cmdecho" 0)
(prompt "\nWritten by Hoang Trung Hau-HTEC, finish ngay 18/6/2006")
(prompt "\nChon mai taluy!")
(setq ss (ssget)
Alist (entget (ssname ss 0))
x0 (cadr (assoc 10 Alist))
y0 (car (cddr (assoc 10 Alist)))
x1 (cadr (assoc 11 Alist))
y1 (car (cddr (assoc 11 Alist)))
)
(initget 1 "Met MLmet")
(setq donvi (getkword "\nChon don vi ban ve Met/MLmet<M/ML>:"))
(if (= (= don vi "Met") T)
(progn
(setq b1 0.1;be rong mo rong ra chan ta luy
b2 0.1;be rong mo rong dem mong
b3 0.5;be rong chan khay
h1 0.5;chieu sau chan khay chua ke lop dem
h2 0.1;chieu day lop dem
htl 0.35;chieu day gia co taluy
mid 0.15;diem giua chon trim
ble 0.5;be rong le gia co
))
(progn
(setq b1 100;be rong mo rong ra chan ta luy
b2 100;be rong mo rong dem mong
b3 500;be rong chan khay
h1 500;chieu sau chan khay chua ke lop dem
h2 100;chieu day lop dem
htl 350;chieu day gia co taluy
mid 150;diem giua chon trim
ble 500;be rong le gia co
))
)
(prompt "\nChon le!")
(setq le (ssget)
Alist1 (entget (ssname le 0))
xx (cadr (assoc 10 Alist1))
yy (car (cddr (assoc 10 Alist1)))
xx1 (cadr (assoc 11 Alist1))
yy1 (car (cddr (assoc 11 Alist1)))
pt16 (list xx yy 0)
pt17 (list xx1 yy1 0)
gle (angle pt16 pt17)
c (* htl (abs (cos gle)))
d (* htl (abs (sin gle)))
)
(if (= (and (< x0 x1) (< y0 y1)) T) ;xet truong hop taluy trai
(progn
(setq pt1 (list x0 y0 0)
pt2 (list x1 y1 0)
pt3 (list (- x0 b1) y0 0)
pt4 (list (- x0 b1) (- y0 h1) 0)
pt5 (list (+ x0 (- b3 b1)) (- y0 h1) 0)
pt6 (list (+ x0 (- b3 b1)) y0 0)
goc (angle pt1 pt2)
a (* htl (abs (cos goc)))
b (* htl (abs (sin goc)))
x2 (+ x0 b)
y2 (- y0 a)
pt7 (list x2 y2 0)
pt8 (list (+ x1 b) (- y1 a) 0)
pt9 (list (- x0 (+ b1 b2)) (- y0 h1) 0)
pt10 (list (- x0 (+ b1 b2)) (- y0 (+ h1 h2)) 0)
pt11 (list (+ x0 b3) (- y0 (+ h1 h2)) 0)
pt12 (list (+ x0 b3) (- y0 h1) 0)
pt13 (polar pt10 (cvunit 135 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt14 (polar pt11 (cvunit 45 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt15 (list (+ x1 d) (- y1 c) 0)
pt18 (list (+ x1 ble) (+ y1 (* ble (abs (/ (sin gle) (cos gle))))) 0)
pt20 (list (+ (+ x1 ble) d) (- (+ y1 (* ble (abs (/ (sin gle) (cos gle))))) c) 0)
);ket thuc gan bien
);ket thuc progn
(if (= (< y0 y1) T);xet diem noi chan khay taluy phai
(setq pt1 (list x0 y0 0)
pt2 (list x1 y1 0)
pt3 (list (+ x0 b1) y0 0)
pt4 (list (+ x0 b1) (- y0 h1) 0)
pt5 (list (- x0 (- b3 b1)) (- y0 h1) 0)
pt6 (list (- x0 (- b3 b1)) y0 0)
goc (angle pt1 pt2)
a (* htl (abs (cos goc)))
b (* htl (abs (sin goc)))
x2 (- x0 b)
y2 (- y0 a)
pt7 (list x2 y2 0)
pt8 (list (- x1 b) (- y1 a) 0)
pt9 (list (+ x0 (+ b1 b2)) (- y0 h1) 0)
pt10 (list (+ x0 (+ b1 b2)) (- y0 (+ h1 h2)) 0)
pt11 (list (- x0 b3) (- y0 (+ h1 h2)) 0)
pt12 (list (- x0 b3) (- y0 h1) 0)
pt13 (polar pt10 (cvunit 45 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt14 (polar pt11 (cvunit 135 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt15 (list (- x1 d) (- y1 c) 0)
pt18 (list (- x1 ble) (+ y1 (* ble (abs (/ (sin gle) (cos gle))))) 0)
pt20 (list (- (- x1 ble) d) (- (+ y1 (* ble (abs (/ (sin gle) (cos gle))))) c) 0)
);ket thuc gan bien
(if (= (and (> x0 x1) (> y0 y1)) T)
(setq pt1 (list x1 y1 0);xet diem noi chan khay taluy phai
pt2 (list x0 y0 0)
pt3 (list (- x1 b1) y1 0)
pt4 (list (- x1 b1) (- y1 h1) 0)
pt5 (list (+ x1 (- b3 b1)) (- y1 h1) 0)
pt6 (list (+ x1 (- b3 b1)) y1 0)
goc (angle pt1 pt2)
a (* htl (abs (cos goc)))
b (* htl (abs (sin goc)))
x2 (+ x1 b)
y2 (- y1 a)
pt7 (list x2 y2 0)
pt8 (list (+ x0 b) (- y0 a) 0)
pt9 (list (- x1 (+ b1 b2)) (- y1 h1) 0)
pt10 (list (- x1 (+ b1 b2)) (- y1 (+ h1 h2)) 0)
pt11 (list (+ x1 b3) (- y1 (+ h1 h2)) 0)
pt12 (list (+ x1 b3) (- y1 h1) 0)
pt13 (polar pt10 (cvunit 135 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt14 (polar pt11 (cvunit 45 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt15 (list (+ x0 d) (- y0 c) 0)
pt18 (list (+ x0 ble) (+ y0 (* ble (abs (/ (sin gle) (cos gle))))) 0)
pt20 (list (+ (+ x0 ble) d) (- (+ y0 (* ble (abs (/ (sin gle) (cos gle))))) c) 0)
);ket thuc gan bien
(setq pt1 (list x1 y1 0);
pt2 (list x0 y0 0)
pt3 (list (+ x1 b1) y1 0)
pt4 (list (+ x1 b1) (- y1 h1) 0)
pt5 (list (- x1 (- b3 b1)) (- y1 h1) 0)
pt6 (list (- x1 (- b3 b1)) y1 0)
goc (angle pt1 pt2)
a (* htl (abs (cos goc)))
b (* htl (abs (sin goc)))
x2 (- x1 b)
y2 (- y1 a)
pt7 (list x2 y2 0)
pt8 (list (- x0 b) (- y0 a) 0)
pt9 (list (+ x1 (+ b1 b2)) (- y1 h1) 0)
pt10 (list (+ x1 (+ b1 b2)) (- y1 (+ h1 h2)) 0)
pt11 (list (- x1 b3) (- y1 (+ h1 h2)) 0)
pt12 (list (- x1 b3) (- y1 h1) 0)
pt13 (polar pt10 (cvunit 45 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt14 (polar pt11 (cvunit 135 "degrees" "radians") (* (+ h1 h2) (sqrt 2)))
pt15 (list (- x0 d) (- y0 c) 0)
pt18 (list (- x0 ble) (+ y0 (* ble (abs (/ (sin gle) (cos gle))))) 0)
pt20 (list (- (- x0 ble) d) (- (+ y0 (* ble (abs (/ (sin gle) (cos gle))))) c) 0)
);ket thuc gan bien
);ket thuc if vong trong
);ket thuc if vong trong
);ket thuc if vong ngoai
(setq pt19 (polar pt18 (cvunit 270 "degrees" "radians") (/ htl (abs (cos gle))))
pt21 (polar pt18 (cvunit 270 "degrees" "radians") (/ (- htl mid) (abs (cos gle))))
)
(command "_.line" pt1 pt3 pt4 pt5 pt6 "")
(command "_.offset" htl ss pt6 "")
(command "_.trim" "c" pt5 pt1 "" "f" pt7 pt6 "" "")
(command "_.line" pt4 pt9 pt10 pt11 pt12 pt5 "")
(command "_.offset" htl le pt15 "")
(command "_.trim" "c" pt8 pt15 "" "f" pt8 pt15 "" "")
(command "_.line" pt18 pt19 "")
(command "_.trim" pt21 "" pt20 "")
(setq lophh (getvar "clayer"))
(command "_.layer" "make" "KL" "")
(setq mau (getvar "cecolor"))
(command "_.cecolor" 1 )
(command "_.line" pt10 pt13 "")
(command "_.line" pt11 pt14 "")
(command "_.cecolor" "Bylayer")
(command "_.clayer" lophh)
(princ)
)

nglam_adg
26-06-2006, 02:55 AM
Hơi rườm rà vì em mới học (ko tải file được nên copy thể này, các bác thông cảm):
;Ve chan khay va gia co mai ta luy
(defun c:taluy (/ ss Alist x0 y0 x1 y1 b1 b2 b3 h1 h2 htl mid donvi ble le Alist1 xx yy xx1 yy1 goc gle a b c d x2 y2 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 pt13 pt14 pt15 pt16 pt17 pt18 pt19 pt20 pt21)
(setvar "cmdecho" 0)
(prompt "\nWritten by Hoang Trung Hau-HTEC, finish ngay 18/6/2006")
(prompt "\nChon mai taluy!")
(setq ss (ssget)
Alist (entget (ssname ss 0))
x0 (cadr (assoc 10 Alist))
y0 (car (cddr (assoc 10 Alist)))
x1 (cadr (assoc 11 Alist))
y1 (car (cddr (assoc 11 Alist)))
)
(initget 1 "Met MLmet")
(setq donvi (getkword "\nChon don vi ban ve Met/MLmet<M/ML>:"))
(if (= (= don vi "Met") T)
(progn
(setq b1 0.1;be rong mo rong ra chan ta luy
b2 0.1;be rong mo rong dem mong
b3 0.5;be rong chan khay
h1 0.5;chieu sau chan khay chua ke lop dem
h2 0.1;chieu day lop dem
htl 0.35;chieu day gia co taluy
mid 0.15;diem giua chon trim
ble 0.5;be rong le gia co
))
(progn
(setq b1 100;be rong mo rong ra chan ta luy
b2 100;be rong mo rong dem mong
b3 500;be rong chan khay
h1 500;chieu sau chan khay chua ke lop dem
h2 100;chieu day lop dem
htl 350;chieu day gia co taluy
mid 150;diem giua chon trim
ble 500;be rong le gia co
))
)
(prompt "\nChon le!")
(setq le (ssget)
.....
)
(command "_.line" pt1 pt3 pt4 pt5 pt6 "")
(command "_.offset" htl ss pt6 "")
(command "_.trim" "c" pt5 pt1 "" "f" pt7 pt6 "" "")
(command "_.line" pt4 pt9 pt10 pt11 pt12 pt5 "")
(command "_.offset" htl le pt15 "")
(command "_.trim" "c" pt8 pt15 "" "f" pt8 pt15 "" "")
(command "_.line" pt18 pt19 "")
(command "_.trim" pt21 "" pt20 "")
(setq lophh (getvar "clayer"))
(command "_.layer" "make" "KL" "")
(setq mau (getvar "cecolor"))
(command "_.cecolor" 1 )
(command "_.line" pt10 pt13 "")
(command "_.line" pt11 pt14 "")
(command "_.cecolor" "Bylayer")
(command "_.clayer" lophh)
(princ)
)
Vì chưa hiểu mục đích của bạn dùng cho lệnh trên nên hơi khó test. Tôi chỉ có 1 vài góp ý về cấu trúc dữ liệu:

1. Biến nhập liệu donvi trong đoạn (if (= (= don vi "Met") T) không đúng do có dấu cách nên lệnh chỉ vẽ được 1 loại đơn vị là mm (do biến donvi sẽ luôn khác "Met").

2. Khi chương trình rẽ nhánh (cho 2 loại đơn vị) bạn không nên viết thành 2 lần code như vậy vì rất dễ nhầm. Bạn có thể lấy 1 đơn vị chuẩn rồi nhân nó với tham số đại diện cho đơn vị thì hay hơn. Với cách này, code của bạn có thể sẽ giảm đi 50% -> load sẽ nhanh hơn.
VD:
(initget 1 "Met MLmet")
(setq donvi (getkword "\nChon don vi ban ve Met/MLmet<M/ML>:"))
(if (= donvi "Met") (setq heso 1.000) (setq heso 1000))
(progn
(setq b1 (* 0.1 heso) ;be rong mo rong ra chan ta luy
b2 (* 0.1 heso) ;be rong mo rong dem mong
b3 (* 0.5 heso) ;be rong chan khay
.....
)

3. Lệnh "TRIM" đòi hỏi đối tượng bị cắt phải đang trong khung hiển thị (trên màn hình) vì thế các đối tượng bị khuất sẽ không được cắt. Bạn sẽ bị lỗi ở đoạn này.

4. Tất cả các lệnh liên quan đến đối tượng sẽ bị chế độ "OSNAP" hiện thời làm sai lệch vị trí -> dẫn đến sai đối tượng. Vì thế, bạn phải lưu ý đến biến hệ thống "Osmode" trước khi gán lệnh.

Tôi sẽ thử chạy lệnh của bạn xem có giúp được gì cho bạn không. Để dễ test, bạn nên giới thệu cụ thể hơn về mục đích của lệnh.

HOÀNG TRUNG HẬU-00X3C
26-06-2006, 01:14 PM
Cảm ơn anh Lam đã quan tâm xem. Mục đích của em là tự vẽ gia cố mái ta luy và chân khay nền đường khi chọn vào mái ta luy và lề đường.
Một cái là trước khi thực hiện lệnh, 1 cái là sau. Nói chung, em đã làm nó chạy rồi nhưng chỉ được 2, 3 lệnh thì no ko vẽ đúng y muốn!

HOÀNG TRUNG HẬU-00X3C
26-06-2006, 01:19 PM
Ban đầu chỉ có như hình vẽ:

nglam_adg
26-06-2006, 11:14 PM
Chỉ cần tắt chế độ bắt điểm đi là nó có thể chạy ít nhất 20 lần mà không có lỗi gì. Nhưng nếu để bắt điểm, nó chỉ chạy được không quá 2 lần. Bạn thử lại xem.
Biến "Osmode" quản lý việc này.

tien2005
27-06-2006, 01:35 PM
Hơi rườm rà vì em mới học (ko tải file được nên copy thể này, các bác thông cảm):
;Ve chan khay va gia co mai ta luy
(defun c:taluy (/ ss Alist x0 y0 x1 y1 b1 b2 b3 h1 h2 htl mid donvi ble le Alist1 xx yy xx1 yy1 goc gle a b c d x2 y2 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 pt13 pt14 pt15 pt16 pt17 pt18 pt19 pt20 pt21)
(setvar "cmdecho" 0)
.......

Để việc kiểm tra việc thực hiện đoạn code Auto Lisp dể dàng Bạn nên (setvar "cmdecho" 1) mục đích là sau khi chương trình chạy bị lổi và dừng lại Bạn bấm F2 (text window) để biết chương trình bị lổi ở đoạn lệnh nào, sau khi chương trình hoàn chỉnh thì (setvar "cmdecho" 0)

HOÀNG TRUNG HẬU-00X3C
28-06-2006, 01:21 PM
Chỉ cần tắt chế độ bắt điểm đi là nó có thể chạy ít nhất 20 lần mà không có lỗi gì. Nhưng nếu để bắt điểm, nó chỉ chạy được không quá 2 lần. Bạn thử lại xem.
Biến "Osmode" quản lý việc này.
Thật cảm ơn anh Lam nhiều, bây giờ thì em đã dùng được rồi.
Cảm ơn bác tien2005, đã cho một cách gỡ rối chương trình.

tdhtkcd
05-07-2006, 07:24 PM
Các bác cho em hỏi tý.
em viết 1 đoạn lisp nhỏ phục vụ cho công việc.
Em có dùng vòng lặp để vẽ đường đen và đường đỏ theo kiểu :
1.Nhập cự ly
2.Nhập cao độ
3.quay lại 1.
Nếu cự ly không nhập thì kết thúc lặp
Nhưng có cái dở là em chưa biết cài undo mark vào đâu cho nó đỡ khổ nếu trót nhập cự ly (khoảng cách lẻ) hoặc cao độ sai
Mong các bác chỉ giáo.
Em gửi kèm file mời các bác xài thử.
(viết trong rừng Cúc Phương)

tdhtkcd
05-07-2006, 07:28 PM
file đính kèm

RNDCE
08-07-2006, 01:23 PM
Gửi anh Nguyễn Lâm:
Đầu tiên xin cảm ơn anh Lâm đã tận tình giúp đỡ anh em trong diễn đàn.
Em có một đoạn lisp với mục đích là: Lấy text của một dim rối trừ đi số của tổng các dim khác rối lấy kết quả này gán cho cho một dim thứ 3. Nhưng em viết ra chay không cho ra kết quả. Anh Lâm kiểm tra dùm em thử.
";------------------------------------------------------------------------------------------------;
(defun bocchu (ss1 c) (setq ob (entget (ssname ss1 c))) (setq ts (assoc 1 ob)) (setq a (cdr ts)))
(defun bocchudt (ob) (setq ts (assoc 1 ob)) (setq a (cdr ts)))
(defun bocdt (ss1 c) (entget (ssname ss1 c)))
(defun sothanhchu (num) (if (< num 1) (strcat "0" (rtos num 2 2)) (rtos num 2 2)))
(defun thaychu (Ob newstr) (setq txtstr (assoc 1 Ob)) (setq newstr (cons 1 newstr)) (entmod (subst newstr txtstr Ob)))
(defun chonchu (dongnhac) (prompt dongnhac) (ssget '((-4 . "<OR") (0 . "text") (0 . "mtext") (-4 . "OR>"))))
(defun chon (str) (ssget '((cons(0 str)))))
(defun bamchon(st) (entget (car (entsel st))))

; TRUDIM.LSP (TRU DIM TRONG BAN VE ACAD) ;
;;;----------------------------------------------------------------;
(DEFUN C:TRUDIM()
(setq a1 (ssget '((0 . "DIMENSION"))))
(setq n1 (sslength a1))
(SETQ TONG 0)
(setq i1 -1)
(while ( > (- n1 1) i1)
(setq i1 (+ i1 1))
(setq at1 (ssname a1 i1))(setq et1 (entget at1))
(setq TONG (+ TONG ATOF(CDR(assoc 1 et1)) ))
)
(setq a2 (ssget '((0 . "DIMENSION"))))
(setq n2 (sslength a2))
(SETQ HIEU 0)
(setq i2 -1)
(while ( > (- n2 1) i2)
(setq i2 (+ i2 1))
(setq at2 (ssname a2 i2))(setq et2 (entget at2))
(setq HIEU ( ATOF (CDR(assoc 1 et2)) ))
)
(SETQ KQ (- TONG HIEU))
(PRINC "KET QUA TINH RA LA:" TONG)
(setq A3 (ssget ))
(THAYCHU A3 (SOTHANHCHU(KQ)))
)
;;;--------------------------------------------------------------------------;"
Và đây là đoạn lisp dùng để tạo ra lớp có tên là : “hatch”. Rồi khi thực hiện lệnh BH (HS, HT, …) các đối tượng hatch tạo ra tự động được gán cho lớp hatch. Sau khi thực hiện hatch xong thì trả lại lớp cũ. Kết quả chạy của em tạo ra được lớp “hatch” nhưng hoặc đối tượng tạo ra không nằm ở lớp “hatch” hoặc đối tượng nằm ở lớp “hatch” nhưng lệnh không trả về lớp trước đó.
“;;;--------------------------------------------------------------------------;
(defun nlh_error (s)
(cond ((= s "quit / exit abort")(princ))((/= s "Function cancelled")(princ (strcat "\nError: " s))))
(command "undo" "e")
(setvar "CMDECHO" nlh_cmdecho)
(setvar "OSMODE" nlh_osmode)
(setvar "TEXTSTYLE" nlh_textstyle)
(setvar "CLAYER" nlh_clayer)
(setvar "CELTYPE" nlh_celtype)
(setvar "CECOLOR" nlh_cecolor)
(setvar "HIGHLIGHT" nlh_highlight)
(setvar "REGENMODE" nlh_regenmode)
(setq *error* olderr)
(princ)
)
;*---------------------------------------------------------------------------;
(defun nlh_save ()
(setq olderr *error* *error* nlh_error
nlh_highlight (getvar "HIGHLIGHT")
nlh_cecolor (getvar "CECOLOR")
nlh_celtype (getvar "CELTYPE")
nlh_clayer (getvar "CLAYER")
nlh_textstyle (getvar "TEXTSTYLE")
nlh_osmode (getvar "OSMODE")
nlh_cmdecho (getvar "CMDECHO")
nlh_regenmode (getvar "REGENMODE")
)
(setvar "CMDECHO" 0)
(command "undo" "g")
)
;*---------------------------------------------------------------------------;
(defun nlh_hatchlayer ()
(setq slist (list (cdr (assoc 2 (tblnext "LAYER" T)))))
(while (setq sname (cdr (assoc 2 (tblnext "LAYER"))))
(if (/= sname "")(setq slist (cons sname slist)))
)
(if (not (member "hatch" slist))
(command "LAYER" "M" "hatch" "C" "252" "" "")
(command "LAYER" "S" "hatch" "")
)
)
;*---------------------------------------------------------------------------;
(defun nlh_restoreh ()
(setvar "CMDECHO" nlh_cmdecho)
(setvar "OSMODE" nlh_osmode)
(setvar "TEXTSTYLE" nlh_textstyle)
(setvar "CLAYER" nlh_clayer)
(setvar "CELTYPE" nlh_celtype)
(setvar "CECOLOR" nlh_cecolor)
(setvar "HIGHLIGHT" nlh_highlight)
(setvar "REGENMODE" nlh_regenmode)
(setq *error* olderr olderr nil)
)
; HACTH ;
;;;--------------------------------------------------------------------------;
(defun c:bh () (nlh_save)(nlh_hatchlayer)(command "bhatch")(nlh_restoreh)(princ))
(defun c:hs() (nlh_save)(nlh_hatchlayer)(command "-bhatch" "p" "s") (nlh_restoreh)(princ))
(defun c:ht() (nlh_save)(nlh_hatchlayer)(command "-bhatch" "p" "u" "45" "100" "n")(nlh_restoreh) (princ))
(defun c:hG() (nlh_save)(nlh_hatchlayer)(command "-bhatch" "p" "brick" "500" "0")(nlh_restoreh)(princ))
(defun c:ha() (nlh_save)(nlh_hatchlayer)(command "-bhatch" "p" "ansi32" "100" "0" )(nlh_restoreh)(princ))
(defun c:hr() (nlh_save)(nlh_hatchlayer)(command "-bhatch" "p" "ar-conc" "50" "0" )(nlh_restoreh)(princ))
(defun c:hc() (nlh_save)(nlh_hatchlayer)(command "-bhatch" "p" "ar-sand" "100" "0" ) (nlh_restoreh)(princ))
(defun c:hB() (nlh_save)(nlh_hatchlayer)(command "-bhatch" "p" "CONC-REINF" "50" "0" ) (nlh_restoreh)(princ))

;;;--------------------------------------------------------------------------;
Xin cảm ơn anh Lâm

nglam_adg
09-07-2006, 03:02 AM
Gửi anh Nguyễn Lâm:
Đầu tiên xin cảm ơn anh Lâm đã tận tình giúp đỡ anh em trong diễn đàn.
Em có một đoạn lisp với mục đích là: Lấy text của một dim rối trừ đi số của tổng các dim khác rối lấy kết quả này gán cho cho một dim thứ 3. Nhưng em viết ra chay không cho ra kết quả. Anh Lâm kiểm tra dùm em thử.
; TRUDIM.LSP (TRU DIM TRONG BAN VE ACAD) ;
;;;----------------------------------------------------------------;
(DEFUN C:TRUDIM()
(setq a1 (ssget '((0 . "DIMENSION"))))
(setq n1 (sslength a1))
(SETQ TONG 0)
(setq i1 -1)
(while ( > (- n1 1) i1)
(setq i1 (+ i1 1))
(setq at1 (ssname a1 i1))(setq et1 (entget at1))
(setq TONG (+ TONG ATOF(CDR(assoc 1 et1)) ))
)
(setq a2 (ssget '((0 . "DIMENSION"))))
(setq n2 (sslength a2))
(SETQ HIEU 0)
(setq i2 -1)
(while ( > (- n2 1) i2)
(setq i2 (+ i2 1))
(setq at2 (ssname a2 i2))(setq et2 (entget at2))
(setq HIEU ( ATOF (CDR(assoc 1 et2)) ))
)
(SETQ KQ (- TONG HIEU))
(PRINC "KET QUA TINH RA LA:" TONG)
(setq A3 (ssget ))
(THAYCHU A3 (SOTHANHCHU(KQ)))
)
;;;--------------------------------------------------------------------------;"

Mã lệnh trừ DIM của bạn có 3 vấn đề - dẫn đến không chạy được:

1. Tại dòng thứ 9 - đoạn (setq TONG (+ TONG ATOF(CDR(assoc 1 et1)) )) thiếu dấu mở (và đóng) ngoặc trước hàm ATOF => Lỗi không chọn được giá trị DIM (từ mã nhóm 1 DXF) => biến TONG không hợp lệ.

2. Mã nhóm 1 DXF của đối tượng DIM cho ra giá trị kích thước của DIM. Giá trị đó chỉ có khi DIM được người dùng nhập vào (tức là không phải DIM thực đo được trên bản vẽ). Nếu là kích thước thực (do AutoCAD đo được) thì giá trị này sẽ không tồn tại (bằng ký tự trắng - STR = ""). Vì thế Giá trị DIM lấy được sẽ luôn = 0. Có một số cách để lấy giá trị này - Bạn thử nghĩ thêm xem.

3. Với những DIM có giá trị "Scale Factor" khác 1 thì giá trị cộng được của bạn sẽ bị sai (trong trường hợp DIM là kích thước thực).
Vì Giá trị hiển thị = Giá trị Scale Factor x Giá trị DIM thực.

Bạn phải khắc phục ít nhất 3 lỗi trên thì mới có thể đi tiếp trong ứng dụng này.

(Tôi là LAM - không phải LÂM)

Snowman
10-07-2006, 04:59 PM
Chào anh Ng Lam !
Em mới học Lisp và đã thử viết 1 số ứng dụng nho nhỏ, có 1 số điều em muốn nhờ anh chỉ dẫn :
Em muốn vẽ hatch, sử dụng nentselp để chọn đường bao, nhưng mặt cắt vẽ ra lại chồng lên 1 số đối tượng khác (text, dim..)làm bản vẽ ko đc đẹp lắm. Vậy có cách nào khắc phục điểm này ko anh?
Trong ứng dụng, em có sử dụng hai vòng lặp ***g nhau để tìm ra phương án theo yêu cầu, nhưng thỉnh thoảng chạy lệnh không ra được kết quả, có phải do số lần lặp quá lớn hay bộ nhớ ko đủ?
Mong anh giải đáp giúp em. Thks !

nglam_adg
10-07-2006, 11:36 PM
Chào anh Ng Lam !
Em mới học Lisp và đã thử viết 1 số ứng dụng nho nhỏ, có 1 số điều em muốn nhờ anh chỉ dẫn :
Em muốn vẽ hatch, sử dụng nentselp để chọn đường bao, nhưng mặt cắt vẽ ra lại chồng lên 1 số đối tượng khác (text, dim..)làm bản vẽ ko đc đẹp lắm. Vậy có cách nào khắc phục điểm này ko anh?
Trong ứng dụng, em có sử dụng hai vòng lặp ***g nhau để tìm ra phương án theo yêu cầu, nhưng thỉnh thoảng chạy lệnh không ra được kết quả, có phải do số lần lặp quá lớn hay bộ nhớ ko đủ?
Mong anh giải đáp giúp em. Thks !
Bạn có thể gửi files của mình lên đây được không ? Nếu hỏi như vậy, tôi không biết phải trả lời thế nào ???

DONGDO
18-07-2006, 01:51 PM
Ha ha! ông anh Taotao395 nghe người ta nói chưa? dùng Excel để làm thống kê chỉ thể hiện đó là một bản vẽ vô cùng nghiệp dư :D
Bi hờ Báo cáo đầu tư cũng yêu cầu dự toán sát lắm rồi:( Có 1 bản thống kê bằng "xeo" quẳng nó cho dự toán đương nhiên tiết kiệm được thời gian+công sức cho cả dự án. Chắc chắn 1 thằng chủ trì chuyên nghiệp sẽ chọn phương án "nghiệp dư" của đ/c Taotao395!
Thực tế thì bản vẽ cuối cùng tới tay bác thợ hồ trên công trường thì nghiệp dư với pờ rồ cũng được làm dùng nhóm bếp khao quân sau khi đổ BT hết :cool:
Vậy anh nào đơn giản hóa được cả quy trình: KT-KC-DT... thì đáng được coi là chuyên nghiệp hơn, về tiểu xảo từng bộ môn thì chơi kiểu gì chẳng được!
:D :D :D The Winner Takes It All:D :D :D

duong2000
25-07-2006, 03:18 PM
Anh Lam ơi!
Em cũng đang tự học lập trình autolisp ,em cũng tìm những sách anh nêu ở trên.Em tìm quyển "Ngôn ngữ lập trình AutoLisp (Nguyễn hữu Lộc - Nguyễn Thanh Trung)" nhưng hiện giờ ở những cửa hàng sách chuyên về xây dựng em tìm đều ko có.Em cũng cần tìm sách về VBA in autoCad.
Vậy anh hay bạn nào có thể biết mua sách này ở đâu tại Hà Nội thì chỉ cho em được ko.
Anh cho em hỏi thêm Autolisp ,Visual lisp ,và VBA in autoCad khác nhau ở điểm gì.Hiện này cái nào được dùng phổ biến nhất.
Em xin cảm ơn!

Honey
25-07-2006, 04:04 PM
Autolisp ,Visual lisp , là 1 còn VBA in autoCad giong như VB vây

nglam_adg
28-07-2006, 09:43 PM
Anh Lam ơi!
Em cũng đang tự học lập trình autolisp ,em cũng tìm những sách anh nêu ở trên.Em tìm quyển "Ngôn ngữ lập trình AutoLisp (Nguyễn hữu Lộc - Nguyễn Thanh Trung)" nhưng hiện giờ ở những cửa hàng sách chuyên về xây dựng em tìm đều ko có.Em cũng cần tìm sách về VBA in autoCad.
Vậy anh hay bạn nào có thể biết mua sách này ở đâu tại Hà Nội thì chỉ cho em được ko.
Anh cho em hỏi thêm Autolisp ,Visual lisp ,và VBA in autoCad khác nhau ở điểm gì.Hiện này cái nào được dùng phổ biến nhất.
Em xin cảm ơn!
Như Honey đã trả lời. AutoLisp và Visual lisp là một (AutoLisp là ngôn ngữ lập trình, Visual lisp là môi trường hỗ trợ lập trình AutoLisp).
Thường thì mạnh ai nấy dùng, không có cái nào là phổ biến nhất. Nếu bạn đã biết về VB thì nên dùng VBA.

thanhtamct
12-08-2006, 12:00 AM
Anh Lam ơi cho xin hỏi
Lúc trước thư viện này mở lên thì có hình trong đó còn bây giờ sử dụng CAD 2007 thì nó ko sử dụng được và hình được gởi kèm theo? Có cách nào khắc phục ko anh Lam? thư viện này Share ko co sourse? Cám ơn

nglam_adg
26-08-2006, 03:20 AM
Anh Lam ơi cho xin hỏi
Lúc trước thư viện này mở lên thì có hình trong đó còn bây giờ sử dụng CAD 2007 thì nó ko sử dụng được và hình được gởi kèm theo? Có cách nào khắc phục ko anh Lam? thư viện này Share ko co sourse? Cám ơn
Nếu muốn TKXD30 cùng lúc chạy trên nhiều phiên bản AutoCAD khác nhau (trên cùng 1 máy) bạn cần cài TKXD30 cho 1 phiên bản CAD bất kỳ đang có. Đăng ký sử dụng chính thức (bằng mã 19741979). Sau khi TKXD30 đã chạy bình thường, bạn vào thư mục C:\TKXD30 và chạy file: Menu_set.exe, chọn thư mục AutoCAD cần cài thêm TKXD30 vào và chọn phần Support Update (trong mục Setup type).
Nếu muốn dùng cho AutoCAD 2007, bạn có thể download file cập nhật support tại: http://www.ketcau.com/forum/showthread.php?t=1774&page=7
Chúc thành công !

thanhtamct
26-08-2006, 09:42 PM
Nếu muốn TKXD30 cùng lúc chạy trên nhiều phiên bản AutoCAD khác nhau (trên cùng 1 máy) bạn cần cài TKXD30 cho 1 phiên bản CAD bất kỳ đang có. Đăng ký sử dụng chính thức (bằng mã 19741979). Sau khi TKXD30 đã chạy bình thường, bạn vào thư mục C:\TKXD30 và chạy file: Menu_set.exe, chọn thư mục AutoCAD cần cài thêm TKXD30 vào và chọn phần Support Update (trong mục Setup type).
Nếu muốn dùng cho AutoCAD 2007, bạn có thể download file cập nhật support tại: http://www.ketcau.com/forum/showthread.php?t=1774&page=7
Chúc thành công !

Anh Lam hiểu lầm ý của em rồi, TKXD 3.0 của anh chạy rất la ok như đây là thu viện khác của người bạn cài cho. Nó chạy trên CAD 2006 được như khi qua CAD 2007 thì chạy được 1 hay la 2 bước là bị như hình trên em đã gởi. ( Nó chạy được trên CAD 2007 được vài bước là hư). Vậy theo anh nó bị vấn đề gì? Cám ơn

nglam_adg
26-08-2006, 10:02 PM
Anh Lam hiểu lầm ý của em rồi, TKXD 3.0 của anh chạy rất la ok như đây là thu viện khác của người bạn cài cho. Nó chạy trên CAD 2006 được như khi qua CAD 2007 thì chạy được 1 hay la 2 bước là bị như hình trên em đã gởi. ( Nó chạy được trên CAD 2007 được vài bước là hư). Vậy theo anh nó bị vấn đề gì? Cám ơn
Tình trạng trên có thể do 2 nguyên nhân:
1. Đường dẫn đến chương trình không chính xác. Mặc định, các bản AutoCAD đều nằm trong thư mục Program Files nhưng có tên khác nhau (AutoCAD 2004....2007). Khi viết, có thể người viết đã đặt sẵn đường dẫn cho CAD2006 vì thế khi dùng cho bản 2007 nó không tìm thấy các files liên kết (files hình ảnh *.sld hoặc *.slb).
2. Do thiết lập hoặc sử dụng trùng biến ("môi trường" hoặc "toàn cục") với 1 chương trình hay 1 file Lisp nào đó đang sử dụng. Lỗi này thường có hiện tượng chương trình chạy được 1 vài bước hoặc 1 vài lần thì sinh lỗi do các biến nhận sai kiểu giá trị. Kiểm tra và chỉnh sửa lỗi này là ngại nhất !

thanhtamct
28-08-2006, 07:59 PM
Cám ơn Anh Lam nhé.

tadaoando in vietnam
01-09-2006, 02:25 AM
Tôi Thấy đa Số Các Lisp Mà Các Bạn Giới Thiệu Rất Hay , Nhưng Gần Như Tất Cả đều Có Trong Phần Mềm Của đại Ca Nglam Rồi.các Bạn Tham Khảo Nhé. Nếu Bác Nglam Có Thời Gian Phát Triển Thêm Phần Vẽ Nước Và Vẽ Sơ đồ Nguyên Lý điện Nữa Thì Càng Tốt.về Cách Thức Xây Dựng ý Tưởng Phần Này Thì Em Chưa Nghĩ Ra Nhưng đại Ca Nglam Nếu Có Time Thì Anh Em Cùng Bàn.

nglam_adg
01-09-2006, 11:33 PM
Tôi Thấy đa Số Các Lisp Mà Các Bạn Giới Thiệu Rất Hay , Nhưng Gần Như Tất Cả đều Có Trong Phần Mềm Của đại Ca Nglam Rồi.các Bạn Tham Khảo Nhé. Nếu Bác Nglam Có Thời Gian Phát Triển Thêm Phần Vẽ Nước Và Vẽ Sơ đồ Nguyên Lý điện Nữa Thì Càng Tốt.về Cách Thức Xây Dựng ý Tưởng Phần Này Thì Em Chưa Nghĩ Ra Nhưng đại Ca Nglam Nếu Có Time Thì Anh Em Cùng Bàn.
Cảm ơn bạn đã có ý xây dựng với TKXD30. Tôi rất muốn mở rộng nhưng thời gian "cày bừa" bận quá không tập trung được. Hơn nữa, ý tưởng thì nhiều nhưng kiến thức và năng lực của tôi có hạn nên chắc phải dần dần thôi.
PS: Nghe nói anh em mình biết nhau ? Rất vui vì điều đó !

myngan
03-09-2006, 10:38 AM
Có bác nào có sách điện tử về Visual lisp không ạ? Bản tiếng Việt hoặc tiếng anh đều tốt cả. Nếu bác nào có thì tải lên mạng cho anh em sinh viên, em cảm ơn các bác nhiều!

thanhtamct
06-09-2006, 12:11 AM
Tình trạng trên có thể do 2 nguyên nhân:
1. Đường dẫn đến chương trình không chính xác. Mặc định, các bản AutoCAD đều nằm trong thư mục Program Files nhưng có tên khác nhau (AutoCAD 2004....2007). Khi viết, có thể người viết đã đặt sẵn đường dẫn cho CAD2006 vì thế khi dùng cho bản 2007 nó không tìm thấy các files liên kết (files hình ảnh *.sld hoặc *.slb).
2. Do thiết lập hoặc sử dụng trùng biến ("môi trường" hoặc "toàn cục") với 1 chương trình hay 1 file Lisp nào đó đang sử dụng. Lỗi này thường có hiện tượng chương trình chạy được 1 vài bước hoặc 1 vài lần thì sinh lỗi do các biến nhận sai kiểu giá trị. Kiểm tra và chỉnh sửa lỗi này là ngại nhất !
Anh Lam ơi, e mò hoài mà chẳng thấy có hiệu quả gì hết, theo kinh nghiệm của anh thì nên tập trung vào những files này? Anh có thể chỉ giúp em ko? E nghĩ là bị trường hợp 2, có thể bị trùng biến. Cám ơn

nglam_adg
06-09-2006, 02:13 AM
Anh Lam ơi, e mò hoài mà chẳng thấy có hiệu quả gì hết, theo kinh nghiệm của anh thì nên tập trung vào những files này? Anh có thể chỉ giúp em ko? E nghĩ là bị trường hợp 2, có thể bị trùng biến. Cám ơn
Nếu có thể, bạn gửi những files đó cho tôi, tôi sẽ thử khắc phục xem sao. Vì chỉ đoán thôi thì rất khó chính xác.

Autocad2008
13-09-2006, 09:41 PM
He he he... anh là dân chuyên nghiệp mà :D anh đã so sánh tốc độ với một đồng chí làm theo một số chương trình thống kê phổ biến => kết quả anh ăn đứt :D Nói chung là dân chuyên nghiệp thì cần xác lập phong cách riêng, không nên thay đổi chương trình làm nhiều, anh đánh giá cao tính kế thừa của các bộ hồ sơ, nó tiết kiệm đáng kể công sức. :).
Còn các đồng chí lập trình cho cái vụ thống kê nên xem thêm mảng excel ứng dụng mạnh hơn nhiều (và không phải dùng máy tính tay hỗ trợ khi thống kê bằng CAD - cho các phép tính phụ : cộng các nhịp cho chiều dài tổng chẳng hạn) :D
DF9úng thế tôi cũng đã từng dùng thử nhưng thực ra chẳng hơn gì nhau vì mỗi ông khi thiết kế có ý tưởng uốn thép khác nhau và phức tạp nên thêm bớt là chuyện bình thường nên khi so sánh tôi thầy Ex của tôi vẫn nhanh hơn và dan năng hơn còn mấy cái nhỏ lẽ kia chuyện nhỏ xin thua font thì lại xấu không đẹp chút nào

Autocad2008
13-09-2006, 09:56 PM
Cái này em đã thử thêm dấu nháy rồi mà cũng chỉ thực hiện được boundary, còn area thì không thực hiện:confused: .
Có phải khi mình viết 1 đoạn chương trình mà thay đổi các biến hệ thống thì kết thúc phải trả lại đúng giá trị cũ không. Vì em thấy anh Lam đưa biến old_bou, nhưng em không biết vì sao anh lại chuyển giá trị Hpbound=1, hay là nếu giá trị =0 (tức là miền) thì không chọn được. Em lại thấy anh dùng lệnh undo lại rất nhiều, không biết có phải là sau khi tạo được đa tuyến bao kín thì đưa nó về lại nguyên trạng bản vẽ, mà "mark" là gì thế anh? Trước undo có dấu gạch thì theo em là để chuyển ngôn ngữ, ngoài ra còn tác dụng gì ko? Anh giải thích giùm em câu này nha:D :

Em đang thử viết thêm 1 đoạn để tính diện tích nhiều hình cùng 1 lúc. Lúc nào viết xong em sẽ đưa lên nhờ các anh chỉnh giúp:)

Tặng đồng chí nhé viết làm gì cho mệt óc thử xem có ra gì khổng
(Defun c:aer ()
(setvar "cmdecho" 0)
(command "osnap" "none")
(setq tl (getreal "\n Scale for Drawing : "))

(setq r 50 )
(repeat r
(setq pt (getpoint "\n Pick point : "))
(setq am (* tl tl))
(setq s 0)

(progn
(while pt
(setq entold (cdr (assoc 5 (entget (entlast)))))
(command "boundary" pt "")
(setq entnew (cdr (assoc 5 (entget (entlast)))))
(if (/= entold entnew)
(progn
(setq entnew (entget (entlast)))
(if (assoc 62 entnew)
(setq
entnew (subst (cons 62 (+ 3 (cdr (assoc 62 entnew))))
(assoc 62 entnew)
entnew
)
)
(setq entnew
(append
entnew
(list
(cons
62
(+ 3
(cdr
(assoc 62
(tblsearch "layer"
(cdr (assoc 8 entnew))
)
)
)
)
)
)
)
)
)


(entmod entnew)
(Command "area" "o" (entlast))
(setq s (+ s (getvar "area")))
(setq pt (getpoint "\n Pick point: "))
(entdel (entlast))
)
(progn
(princ "Error Wrong Point")
(setq pt (getpoint "\n Pick point: "))
)
)
)

)

(setq pt1 (getpoint "\nPick any point to draw area : "))
(setq dt (/ (* s am) 1000000))
(setq dt (strcat (rtos dt 2 2) " m²."))


(Setq ldt (Getstring t "\n Kind of area : "))
(cond

((= ldt "dx") (setq ldt "SÐáxây="))
((= ldt "bt") (setq ldt "SBêtông="))
((= ldt "d" ) (setq ldt "SÐào="))
((= ldt "dd") (setq ldt "SÐ?p="))
((= ldt "ph") (setq ldt "SP.hoá="))
((= ldt "ck") (setq ldt "SC.khay="))
((= ldt "dl") (setq ldt "SDam l?c="))
((= ldt "cl") (setq ldt "SCát l?c="))
((= ldt "tc") (setq ldt "SÐàoTC="))
((= ldt "tcc") (setq ldt "SÐ?p TC="))
((= ldt "lk") (setq ldt "SÐálkhan= "))
((= ldt "cp") (setq ldt "SC.ph?i= "))
((= ldt "dm") (setq ldt "Fdm = "))
)
(command "text" pt1 3.0 0 (strcat ldt dt))
(ALERT (strcat "\t\t
DiÖn tÝch = " dt))

))

minhce
20-09-2006, 05:15 PM
Khi chọn xong nó hỏi "Kind of area" là gì vậy Bác?

Autocad2008
21-09-2006, 11:13 PM
Khi chọn xong nó hỏi "Kind of area" là gì vậy Bác?
((= ldt "dx") (setq ldt "SÐáxây="))
((= ldt "bt") (setq ldt "SBêtông="))
((= ldt "d" ) (setq ldt "SÐào="))
((= ldt "dd") (setq ldt "SÐ?p="))
((= ldt "ph") (setq ldt "SP.hoá="))
((= ldt "ck") (setq ldt "SC.khay="))
((= ldt "dl") (setq ldt "SDam l?c="))
((= ldt "cl") (setq ldt "SCát l?c="))
((= ldt "tc") (setq ldt "SÐàoTC="))
((= ldt "tcc") (setq ldt "SÐ?p TC="))
((= ldt "lk") (setq ldt "SÐálkhan= "))
((= ldt "cp") (setq ldt "SC.ph?i= "))
((= ldt "dm") (setq ldt "Fdm = "))
)
Nếu như bạn cần tính diện tích hình đó là bê tông thì kind là bt
sẽ ra kết quả lkà Sbêtông=......m²
OK chứ

nguyenphucce
24-09-2006, 07:24 PM
Anh Lam và các anh cho em xin hỏi,
Trong Autocad, mình có thể tạo được 1 đối tượng mới không? Cái kiểu như Dimension ấy. Tức là đối tượng đó có nhiều đối tượng con liên kết nhau (Trong dimension là text hiển thị kích thước và khoảng cách giữa hai điểm gióng), khi tác động làm thay đổi 1 đối tượng thì đối tượng kia cũng sẽ tự thay đổi theo.

Em vẽ hoàn chỉnh kết cấu 1 cái dầm 4m. Sau đó stretch còn 3,5m chẳng hạn. Em muốn khi đó các khoảng bố trí thép đai cũng sẽ tự stretch theo tỉ lệ đó.
Mong các anh trả lời em, mình có thể tự tạo loại đối tượng đó không, và dùng chương trình gì để làm.
Em cám ơn nhiều.

HOÀNG TRUNG HẬU-00X3C
03-10-2006, 01:11 PM
Tặng đồng chí nhé viết làm gì cho mệt óc thử xem có ra gì khổng
(Defun c:aer ()
(setvar "cmdecho" 0)
(command "osnap" "none")
(setq tl (getreal "\n Scale for Drawing : "))

(setq r 50 )
(repeat r
(setq pt (getpoint "\n Pick point : "))
(setq am (* tl tl))
(setq s 0)

(progn
(while pt
(setq entold (cdr (assoc 5 (entget (entlast)))))
(command "boundary" pt "")
(setq entnew (cdr (assoc 5 (entget (entlast)))))
(if (/= entold entnew)
(progn
(setq entnew (entget (entlast)))
(if (assoc 62 entnew)
(setq
entnew (subst (cons 62 (+ 3 (cdr (assoc 62 entnew))))
(assoc 62 entnew)
entnew
)
)
(setq entnew
(append
entnew
(list
(cons
62
(+ 3
(cdr
(assoc 62
(tblsearch "layer"
(cdr (assoc 8 entnew))
)
)
)
)
)
)
)
)
)


(entmod entnew)
(Command "area" "o" (entlast))
(setq s (+ s (getvar "area")))
(setq pt (getpoint "\n Pick point: "))
(entdel (entlast))
)
(progn
(princ "Error Wrong Point")
(setq pt (getpoint "\n Pick point: "))
)
)
)

)

(setq pt1 (getpoint "\nPick any point to draw area : "))
(setq dt (/ (* s am) 1000000))
(setq dt (strcat (rtos dt 2 2) " m²."))


(Setq ldt (Getstring t "\n Kind of area : "))
(cond

((= ldt "dx") (setq ldt "SÐáxây="))
((= ldt "bt") (setq ldt "SBêtông="))
((= ldt "d" ) (setq ldt "SÐào="))
((= ldt "dd") (setq ldt "SÐ?p="))
((= ldt "ph") (setq ldt "SP.hoá="))
((= ldt "ck") (setq ldt "SC.khay="))
((= ldt "dl") (setq ldt "SDam l?c="))
((= ldt "cl") (setq ldt "SCát l?c="))
((= ldt "tc") (setq ldt "SÐàoTC="))
((= ldt "tcc") (setq ldt "SÐ?p TC="))
((= ldt "lk") (setq ldt "SÐálkhan= "))
((= ldt "cp") (setq ldt "SC.ph?i= "))
((= ldt "dm") (setq ldt "Fdm = "))
)
(command "text" pt1 3.0 0 (strcat ldt dt))
(ALERT (strcat "\t\t
DiÖn tÝch = " dt))

))
Vẫn chưa ra gì bác ạ! Em đã thử rồi! Hình như đoạn này bác viết trong một đoạn tổng thể lớn hơn nào đó. Bác xem lại giúp em. Lâu rồi, bận quá em không đụng đến món này. Nghe món VBA trong CAD gần gũi với VB lại rất dễ học nên em đang chuyển sang món này.
Cảm ơn anh Cad2008 đã quan tâm.

Honey
03-10-2006, 03:15 PM
Toi co mot chung trinh thong ke thẹp ban cu ve cay thep ra binh thuọng sau do dung lenh nay no se tinh khong luong cho bạn Theo toi thay cach lam nay rat tiẹn luc thay doi thi lam rat nhanh. Cac ban co the mo file acad tham khao them.

longnh
07-10-2006, 08:40 PM
Anh Lam ơi!
Em cũng đang tự học lập trình autolisp ,em cũng tìm những sách anh nêu ở trên.Em tìm quyển "Ngôn ngữ lập trình AutoLisp (Nguyễn hữu Lộc - Nguyễn Thanh Trung)" nhưng hiện giờ ở những cửa hàng sách chuyên về xây dựng em tìm đều ko có.Em cũng cần tìm sách về VBA in autoCad.
Vậy anh hay bạn nào có thể biết mua sách này ở đâu tại Hà Nội thì chỉ cho em được ko.
Anh cho em hỏi thêm Autolisp ,Visual lisp ,và VBA in autoCad khác nhau ở điểm gì.Hiện này cái nào được dùng phổ biến nhất.
Em xin cảm ơn!
mình hơi có một thắc mắc là anh em rất muốn lập trình nhưng ngại đọc tài liệu nguyên bản tiếng Anh. Làm sao có thể tránh được Dim... as ...
Modelspace... Thisdrawing... line...
Vậy tốt nhất là đọc nguyên bản phần nào không hiểu thì các thành viên khác sẽ giúp đỡ. Tôi cũng là người bắt đầu tiếp xúc với VBA từ bản 2000 nên cũng có một chút kinh nghiệm.
Phân tích cho thấy: Lisp, VBA, ARX mỗi cái có lợi thế riêng. Cái thứ 3 rất vất vả vì thay đổi theo các phiên bản khác nhau. Cái đầu thì năng suất code chậm. Debug vất vả.
Tóm lại với các ứng dụng thông thường có thể chọn VBA.
Sách bạn nên đọc là cuốn đi kèm bản Cad2000 cùng các ví dụ chi tiết trong đó. Điều kiện tối thiểu là tiếng Anh + VB.

tien2005
09-10-2006, 01:37 PM
Anh Lam và các Bạn cho Tôi hỏi:
Tôi có 1 đói tượng dạng LWPOLYLINE (được vẽ bằng lệnh RECTANG). Vậy trong Visual Lisp làm như thế nào để lấy được tọa độ của các điểm tạo nên đối tượng đó?
Mong được sự giúp đỡ.
Thân.

nong truong thanh
15-10-2006, 05:40 PM
em chi moi lam quen voi autolisp
mong nhung bac tien boi hay chi giup
em dang tao menu nhung khong biet lam sao de no co the tao duoc tieng viet co dau
cac menu cua em chi toan la tieng viet khong dau
mong cac thay va cac anh giup do
chan thanh cam mon

nglam_adg
16-10-2006, 03:18 AM
Anh Lam và các Bạn cho Tôi hỏi:
Tôi có 1 đói tượng dạng LWPOLYLINE (được vẽ bằng lệnh RECTANG). Vậy trong Visual Lisp làm như thế nào để lấy được tọa độ của các điểm tạo nên đối tượng đó?
Mong được sự giúp đỡ.
Thân.
Bản thân đối tượng LWPOLYLINE chỉ có thể xác định được 1 điểm (mã nhóm 10) nên nếu dùng cách thông thường thì không thể lấy đủ dữ liệu đỉnh của đối tượng. Cách dễ nhất là dùng "tiểu xảo" tạm thời chuyển nó sang đối tượng LINE. Sau khi có được tọa độ các đỉnh thì trả nó về dạng LWPOLYLINE ban đầu.
Đoạn mã lệnh dưới đây sẽ chèn TEXT mẫu vào 4 đỉnh 1 hình chữ nhật (là đối tượng LWPOLYLINE):
----------------------------------------------
(defun C:LW (/ rec_lw list_dat_lw ss_obj0 ss_obj2 p10_1 p10_2 p11_1 p11_2 re_sec)
(if(setq rec_lw(entsel))
(progn
(setq list_dat_lw(entget(car rec_lw)))
(if(= (cdr(assoc 0 list_dat_lw)) "LWPOLYLINE")
(progn
(command "._Undo" "M")
(command "_.Explode" rec_lw)
(setq re_sec (ssget "P" )
ss_obj0(entget(ssname re_sec 0))
p10_1(cdr(assoc 10 ss_obj0))
p11_1(cdr(assoc 11 ss_obj0))
ss_obj2(entget(ssname re_sec 2))
p10_2(cdr(assoc 10 ss_obj2))
p11_2(cdr(assoc 11 ss_obj2)))
);progn
);if
(command "_.Undo" "B")
(ins_p p10_1 "1")
(ins_p p11_1 "2")
(ins_p p10_2 "3")
(ins_p p11_2 "4")
(setq p10(cdr(assoc 10 list_dat_lw)))
);progn
);if
(princ)
)
(defun ins_p (p tt)
(command "_.TEXT" "J" "M" p "1" "" tt )
)
----------------------------------------------
em chi moi lam quen voi autolisp
mong nhung bac tien boi hay chi giup
em dang tao menu nhung khong biet lam sao de no co the tao duoc tieng viet co dau
cac menu cua em chi toan la tieng viet khong dau
mong cac thay va cac anh giup do
chan thanh cam mon
Bạn phải xác định loại Fonts nào sẽ sử dụng cho việc hiển thị trên Menu chương trình của mình lúc đó mới có thể tính đến phương pháp thực hiện. Nhưng trước hết bạn phải biết gõ Tiếng Việt cho những câu hỏi của mình trên diễn đàn này đã.

nong truong thanh
16-10-2006, 01:46 PM
Anh Lâm thân mếm cam mơn rất nhiều về những lời nhắc nhở của anh
em thường sử dung font Fixedsys dể tạo hộp thoại và menu, mong anh chỉ giáo để em có thể tạo được menu và hộp thoại tiếng việt.
Cám mơn anh nhiều

nglam_adg
16-10-2006, 11:11 PM
Anh Lâm thân mếm cam mơn rất nhiều về những lời nhắc nhở của anh
em thường sử dung font Fixedsys dể tạo hộp thoại và menu, mong anh chỉ giáo để em có thể tạo được menu và hộp thoại tiếng việt.
Cám mơn anh nhiều
Có nhiều cách khác nhau để thực hiện việc này và mỗi người sẽ có cách riêng của mình. Theo tôi, các bước tiến hành gồm:
- Chọn loại Fonts (system) theo đối tượng sử dụng. Chuẩn Unicode đang được coi là "ISO" nhất hiện nay. Nếu bạn ở Bắc, bạn nên cân nhắc dùng Fonts TCVN3-ABC. Nếu ở Nam, Fonts VNI lại là chủ đạo.
- AutoLisp rất dễ tính về mặt cấu trúc "String" vì thế có thể viết và sửa khá thoải mái. Đầu tiên bạn viết các files Menu ở dạng không dấu. sau khi kiểm tra ứng dụng chạy ổn định, bạn có thể dùng bất kỳ phần mềm soạn thảo nào (có hỗ trợ loại fonts đã chọn) mở các files Menu đó ra chuyển chúng về fonts muốn sử dụng rồi sửa lại các dòng "String" thành Tiếng Việt. Lưu file dưới dạng TEXT là xong.
Cho dù bạn chọn kiểu Fonts nào thì nó bắt buộc phải là System font.

nong truong thanh
17-10-2006, 12:24 AM
cam mơn anh Lam nhiệu em mạn phép làm phiền anh một tí thôi. Em có viết được cái lisp để tọa độ của đường thẳng qua excel (lưu dưới dạng csv). Nhưng giờ em muốn làm ngược lại (xuất giá trị trong bảng excel vao trong cad để vẽ thì làm sao hả anh).

nglam_adg
17-10-2006, 01:57 AM
cam mơn anh Lam nhiệu em mạn phép làm phiền anh một tí thôi. Em có viết được cái lisp để tọa độ của đường thẳng qua excel (lưu dưới dạng csv). Nhưng giờ em muốn làm ngược lại (xuất giá trị trong bảng excel vao trong cad để vẽ thì làm sao hả anh).
Không biết bạn viết phần xuất sang Excel bằng phương pháp nào. Nhưng nếu muốn liên kết với Excel, bạn nên dùng ActiveX (hàm vlax-import-type-library hay vlax-get-object "Application").
VD:
......
(if(setq myapp(vlax-get-or-create-object "Excel.Application"))
(progn
;;;Mở workbook càn làm việc
(vlax-invoke-method (vlax-get-property myapp 'WorkBooks) 'Open fileName)
;;;Đặt trạng thái chọn
(vla-put-visible myApp 0)
(setq myWBooks(vlax-get myApp "Workbooks"))
;;;Mở file Xls
(setq myWBook(vla-open myWBooks fileName))
;;;;Lấy giá trị
(setq mySheets(vlax-get myWBook "Sheets"))
;;;Lấy danh sách Sheet
(princ "\n Getting Sheet Names from Excel...")
(setq shtCnt(vla-get-count mySheets))
(setq sheetList(list))
(setq cnt 1)
(while(<= cnt shtCnt)
(setq sht(JXCL-get-item mySheets cnt))
(setq shtName(vla-get-name sht))
(setq sheetList(append sheetList(list shtName)))
(setq cnt(+ cnt 1))
)
.....
Phần này sẽ mất khá nhiều thời gian để hiểu.

nong truong thanh
18-10-2006, 09:51 PM
Anh Lam ơi em có một file lisp nhưng không hiểu sao phải chọn điểm trước thi nó mới vẽ con nếu mình nhập giá trị trước sau đó mới chọn điểm để nó vẽ thì nó lại không chịu nhờ anh chi giáo giúp. Anh biết tài liệu tiếng việt nào nói ve mấy cái lệnh VLA, VLAX trong cad không. chân thành cám mơn.
Thanh

nglam_adg
19-10-2006, 01:28 AM
Anh Lam ơi em có một file lisp nhưng không hiểu sao phải chọn điểm trước thi nó mới vẽ con nếu mình nhập giá trị trước sau đó mới chọn điểm để nó vẽ thì nó lại không chịu nhờ anh chi giáo giúp. Anh biết tài liệu tiếng việt nào nói ve mấy cái lệnh VLA, VLAX trong cad không. chân thành cám mơn.
Thanh
Cảm ơn bạn đã tin tưởng !
Có thể bạn sẽ thấy tự ái nhưng thực sự tôi chưa thấy ai viết ứng dụng vô tổ chức như bạn. Với cách viết này, bạn sẽ chỉ quản lý được vài ba ứng dụng là may rồi. Có thể bạn mới làm quen với AutoLisp nhưng như vậy thì phải càng kỹ tính mới có thể tiếp tục được.

1. Những lỗi cơ bản mắc phải:
- Khai báo biến vô tội vạ nhưng lại không giải phóng (gán giá trị NIL) sau khi sử dụng xong -> Các biến bị trùng (cụ thể trong chương trình của bạn là "String" và "Real") dẫn đến không thể chạy được đến lần thứ hai sau khi gây lỗi.
- Các hàm lấy giá trị lặp đi lặp lại quá nhiều như hàm lấy giá trị G, gán "Action_tile"... (cặp hàm "(... Accept ... (done_dialog)" bị lặp lại tới 26 lần - trong khi chỉ cần 1 lần là đủ).
...
Nói tóm lại, bạn cần tổ chức và quản lý hàm và biến tốt hơn nếu muốn có 1 chương trình ổn định và dễ kiểm soát (ngay cả khi gây lỗi).

2. Lỗi không chạy nếu chọn điểm sau khi nhập liệu:
Những đoạn mã gây lỗi trong c.trình:
...
(if (/= g1 nil) (set_tile "g1" (rtos g1 2 2)))
(action_tile "g1" "(setq g1 (get_tile \"g1\"))")
(action_tile "accept" "(GT_tile) (done_dialog)")
...
(if (/= g24 nil) (set_tile "g24" (rtos g24 2 2)))
(action_tile "g24" "(setq g24 (get_tile \"g4\"))")
(action_tile "accept" "(GT_tile) (done_dialog)"
...
Dòng1:
Viết như trên có nghĩa là khi chạy vòng lặp này, nếu giá trị g(x) đã có thì chuyển nó thành 1 chuỗi rồi hiển thị tại key tương ứng với g(x). Giá trị g(x) ở đây được hiểu là số thực.
Dòng 2:
Khi nhập số vào nút có key="g1" (đến nút có key="g24") giá trị g(x) tương ứng sẽ ngay lập tức được gán giá trị. Giá trị này là 1 chuỗi (String).
Dòng 3:
Khi nhấn "OK", hàm (GT_tile) sẽ được định giá. Hàm này lấy giá trị của tất cả các giá trị của key g(x) và gán giá trị số thực cho các biến g(x) - tương ứng với các key g(x).

Bạn đã thấy điểm vô lý chưa?
Khi bạn chọn điểm trước, lúc đó các giá trị biến g(x) tại các key g(x) chưa có nên chương trình chạy. Khi bạn nhập giá trị trước, ngay lập tức các biến g(x) bị gán giá trị là các chuỗi (dòng 2). Sau khi chọn được điểm, Dialog được load lại. Lúc này hàm "set_tile" đòi hỏi cung cấp giá trị là số thực (dòng 1) trong khi bạn lại cung cấp cho nó 1 chuỗi (từ dòng 2) -> Không chạy là đương nhiên.
Dưới đây là file Lisp của bạn tôi đã sửa lỗi trên.

quocyen
20-10-2006, 12:59 AM
Bản thân đối tượng LWPOLYLINE chỉ có thể xác định được 1 điểm (mã nhóm 10) nên nếu dùng cách thông thường thì không thể lấy đủ dữ liệu đỉnh của đối tượng. Cách dễ nhất là dùng "tiểu xảo" tạm thời chuyển nó sang đối tượng LINE. Sau khi có được tọa độ các đỉnh thì trả nó về dạng LWPOLYLINE ban đầu.
Đoạn mã lệnh dưới đây sẽ chèn TEXT mẫu vào 4 đỉnh 1 hình chữ nhật (là đối tượng LWPOLYLINE):
----------------------------------------------
(defun C:LW (/ rec_lw list_dat_lw ss_obj0 ss_obj2 p10_1 p10_2 p11_1 p11_2 re_sec)
(if(setq rec_lw(entsel))
(progn
(setq list_dat_lw(entget(car rec_lw)))
(if(= (cdr(assoc 0 list_dat_lw)) "LWPOLYLINE")
(progn
(command "._Undo" "M")
(command "_.Explode" rec_lw)
(setq re_sec (ssget "P" )
ss_obj0(entget(ssname re_sec 0))
p10_1(cdr(assoc 10 ss_obj0))
p11_1(cdr(assoc 11 ss_obj0))
ss_obj2(entget(ssname re_sec 2))
p10_2(cdr(assoc 10 ss_obj2))
p11_2(cdr(assoc 11 ss_obj2)))
);progn
);if
(command "_.Undo" "B")
(ins_p p10_1 "1")
(ins_p p11_1 "2")
(ins_p p10_2 "3")
(ins_p p11_2 "4")
(setq p10(cdr(assoc 10 list_dat_lw)))
);progn
);if
(princ)
)
(defun ins_p (p tt)
(command "_.TEXT" "J" "M" p "1" "" tt )
)
----------------------------------------------
.
Cho em hỏi bác Lâm, em đang cần cái lisp để lấy số liệu tọa độ 1 điểm trong CAD xuất ra txt. Thông thường em phải copy số x=****, y=**** sau khi dùng lệnh ID và copy sang exel, rất mất thời gian. Bác có cái nào giúp em bớt công đoạn copy and paste nhàm chán đó không???

tien2005
20-10-2006, 03:41 PM
Cám ơn Anh Lam đã chỉ cách lấy các điểm tạo nên 1 polyline. Trong thời gian đó Tôi cũng đã tìm được cách lấy các điểm đó (đoạn code bên dưới), mong Anh Lam xem và cho ý kiến về đoạn code này.
(defun c:laydiem (/ alist stt blist m a11 ptx pty pt1)
(SETVAR "CMDECHO" 0)
(princ "\nChon polyline>:")
(setq alist (ssget '((0 . "LWPOLYLINE")))
stt 0
)
(REPEAT (SSLENGTH alist)
(SETQ blist (entget (ssname alist stt))
m 0
)
(while (< m (length blist))
(setq a11 (nth m blist)
m (1+ m)
)
(if (= "10" (rtos (car a11) 2 0));diem dau cua duong thang, diem cuoi la 11
(progn
(setq pt1 (list (cadr a11) (caddr a11)))
(command "_.donut" 0 300 pt1 "")
)
);if
);while
(setq stt (1+ stt))
);repeat
(princ)
)

tien2005
20-10-2006, 03:58 PM
Anh Lam có thể chỉ giúp Tôi chọn tất cả các đối tượng là polyline trên lớp layer1 thuộc chế độ model (hoặc layout1, layout2, ...)
.........
(setq #CTAB (GETVAR "CTAB"))
(setq DT (ssget "X" '((-4 . "!and")(8 . "layer1")(0 . "LWPOLYLINE")(-4 . "and>"))))
..........
Đoạn code trên chỉ chọn được các đối tượng polyline thuộc layer1 trên cả model và các layout

Khi đưa điều kiện model hoặc layout vào thì không sử dụng được
.........
(setq #CTAB (GETVAR "CTAB"))
(setq DT (ssget "X" '((-4 . "!and")(8 . "layer1")(0 . "LWPOLYLINE")(list (cons 410 #CTAB))(-4 . "and>"))))
..........
ghi chú: dấu ! được thay bởi dấu <
Mong Anh Lam chỉ giúp.
Thân.

nglam_adg
22-10-2006, 08:40 PM
Anh Lam có thể chỉ giúp Tôi chọn tất cả các đối tượng là polyline trên lớp layer1 thuộc chế độ model (hoặc layout1, layout2, ...)
.........
(setq #CTAB (GETVAR "CTAB"))
(setq DT (ssget "X" '((-4 . "!and")(8 . "layer1")(0 . "LWPOLYLINE")(-4 . "and>"))))
..........
Đoạn code trên chỉ chọn được các đối tượng polyline thuộc layer1 trên cả model và các layout

Khi đưa điều kiện model hoặc layout vào thì không sử dụng được
.........
(setq #CTAB (GETVAR "CTAB"))
(setq DT (ssget "X" '((-4 . "!and")(8 . "layer1")(0 . "LWPOLYLINE")(list (cons 410 #CTAB))(-4 . "and>"))))
..........
ghi chú: dấu ! được thay bởi dấu <
Mong Anh Lam chỉ giúp.
Thân.
Cũng giống như Excel, ký hiệu ' (phẩy trên) trong Autolisp báo hiệu cho chương trình không cần định giá biểu thức hay các giá... trị đi theo nó.
Khi bạn viết:
(setq DT (ssget "X" '((-4 . "< and")(8 . "layer1")(0 . "LWPOLYLINE")(list (cons 410 #CTAB))(-4 . "and>"))))
AutoLisp sẽ coi nguyên đoạn: (list (cons 410 #CTAB)) như một điều kiện lọc chứ không định giá để tạo ra giá trị DXF mã nhóm 410 như bạn cần. Vì cấu trúc điều kiện lọc không thỏa mãn nên chương trình sẽ báo lỗi.
Bản thân (cons 410 #CTAB) cũng đã tạo ra một mã nhóm chuẩn nên nếu viết (list(cons 410 #CTAB)) như bạn sẽ thêm 1 lỗi nữa là sinh ra 1 list gồm 1 đối tượng chứ không phải 1 mã nhóm.
Cách sửa như sau:
(setq TD (ssget "X" (list '(-4 . "< and") '(0 . "LWPOLYLINE") '(8 . "layer1")
(cons 410 (getvar "ctab")) '(-4 . "and>"))))
-------------
P/S: Giữa dấu < và and không có dấu cách.

pooh_21
23-10-2006, 06:59 PM
Cho em hỏi cách làm lsp mà dim được 2 đối tượng với:
Ví dụ mình có 4 điểm
*(p1) *(ps2)
*(p3) *(p4)

sau khi chọn điểm p1 thì nó sẽ vẽ thành 2 đường thẳng nối p1--p2, p3--p4 sau đó tự dim cho mình (p3---p1, p1--p2, p3---p4)

Vì mới học lisp mà chưa tìm được tài liệu nào nói về cách dim cả, các anh giúp em với!
Thanks

nglam_adg
24-10-2006, 12:56 AM
Cho em hỏi cách làm lsp mà dim được 2 đối tượng với:
Ví dụ mình có 4 điểm
*(p1) *(ps2)
*(p3) *(p4)

sau khi chọn điểm p1 thì nó sẽ vẽ thành 2 đường thẳng nối p1--p2, p3--p4 sau đó tự dim cho mình (p3---p1, p1--p2, p3---p4)

Vì mới học lisp mà chưa tìm được tài liệu nào nói về cách dim cả, các anh giúp em với!
Thanks
Trong AutoLisp, mọi dữ liệu điểm đều phải xác định - tức là 1 giá trị cụ thể. Chỉ với 1 điểm rất khó có thể tìm được các điểm không xác định còn lại.

pooh_21
24-10-2006, 10:20 AM
Trong AutoLisp, mọi dữ liệu điểm đều phải xác định - tức là 1 giá trị cụ thể. Chỉ với 1 điểm rất khó có thể tìm được các điểm không xác định còn lại.
Sorry anh Lam vì câu hỏi của em chưa được rõ ràng:( em lấy tạm ví dụ RNDCE
Từ một hình chữ nhật có sẵn trên bản vẽ với hai điểmlà L1, L2 -> cần tạo ra một hình chữ nhật mới nằm bên trong hình chữ nhật cũ với các điểm là (L1-2d, L2-2d) trong đó d=min(0.25L1, 0.25L2). Em chạy đoạn lisp trên thì kết quả cho ra tọa độ 3D của một điểm, không tạo được hình chữ nhât.

(defun c:rt ()
(setq olderr *error*
*error* myerror)
(setq pt1 (getpoint "\nFirst point of rectangle..."))
(setq pt2 (getpoint pt1 "\nCorner of rectangle..."))
(setq a(angle pt1 pt2)
dis(distance pt1 pt2))
(setq co (* dis (cos a))
si (* dis (sin a)))
(setq delta (min (* 0.25 co) (* 0.25 si)))
(setq pta (polar pt1 (* 0.25 pi) (* delta (cos (/ pi 4)) ))) )
(setq ptb (polar pta (/ pi 2.0) (- si (* 2 delta))) )
(setq ptc (polar ptb 0 (- co (* 2 delta))) )
(setq ptd (polar pta 0 (- co (* 2 delta))) )
(command "_.pline" pta ptb ptc ptd "c")
(setq *error* olderr)
(princ)
)

Bây giờ nếu em muốn dung Lisp để dim 4 điểm (L1 ---(L1-2d)), ((L1-2d) ---(L2-2d)), ((L2-2d)----(L2) thì phải làm thế nào ạ?

nglam_adg
24-10-2006, 11:55 PM
Sorry anh Lam vì câu hỏi của em chưa được rõ ràng:( em lấy tạm ví dụ RNDCE
Từ một hình chữ nhật có sẵn trên bản vẽ với hai điểmlà L1, L2 -> cần tạo ra một hình chữ nhật mới nằm bên trong hình chữ nhật cũ với các điểm là (L1-2d, L2-2d) trong đó d=min(0.25L1, 0.25L2). Em chạy đoạn lisp trên thì kết quả cho ra tọa độ 3D của một điểm, không tạo được hình chữ nhât.
...
Bây giờ nếu em muốn dung Lisp để dim 4 điểm (L1 ---(L1-2d)), ((L1-2d) ---(L2-2d)), ((L2-2d)----(L2) thì phải làm thế nào ạ?
Đoạn Lisp của bạn bị thừa 1 dấu đóng ngoặc (màu đỏ) ở cuối dòng:
(setq pta (polar pt1 (* 0.25 pi) (* delta (cos (/ pi 4)) ))) )
Chỉ cần xóa nó đi là sẽ vẽ được HCN.
Thông thường nếu muốn vẽ 1 đường DIM đơn bằng AutoLisp người ta thường dùng lệnh "DIM1". Lệnh này khác lệnh DIM thông thường là sẽ tự động thoát khỏi vòng lặp lệnh DIM sau khi vẽ xong đường DIM.
Vì không hiểu ý đồ và mục đích của bạn nên tạm thời tôi chỉnh để có thể vẽ được DIM theo phương ngang. Bạn có thể chỉnh lại cho phù hợp.
;;;------------------------------------
(defun c:rt (/ pt1 pt2 tps)
(setq olderr *error* *error* myerror)
(setq old_os(getvar "Osmode"))
(setq pt1 (getpoint "\nFirst point of rectangle..."))
(setq pt2 (getpoint pt1 "\nCorner of rectangle..."))
(setq a(angle pt1 pt2)
dis(distance pt1 pt2))
(setq co (* dis (cos a))
si (* dis (sin a)))
(setq delta (min (* 0.25 co) (* 0.25 si)))
(setq pta (polar pt1 (* 0.25 pi) (* delta (cos (/ pi 4)) )))
(setq ptb (polar pta (/ pi 2.0) (- si (* 2 delta))) )
(setq ptc (polar ptb 0 (- co (* 2 delta))) )
(setq ptd (polar pta 0 (- co (* 2 delta))) )
(setvar "OSmode" 0)
(command "_.pline" pta ptb ptc ptd "c")
(setvar "Osmode" old_os)
(setq tps(getpoint "\nVi tri dat DIM: "))
;;;------------------------------------
(if(and pt1 pt2 tps pta ptb ptc ptd)
(_DIM pt1 pta ptc pt2 tps))
;;;------------------------------------
(setq *error* olderr)
(princ)
)
;;;------------------------------------
(defun _DIM (p1 p2 p3 p4 p5)
(setq old_os(getvar "Osmode"))
(setvar "OSmode" 0)
(command "_.DIM1" "hor" p1 p2 p5 "")
(command "_.DIM1" "hor" p2 p3 p5 "")
(command "_.DIM1" "hor" p3 p4 p5 "")
(setvar "Osmode" old_os)
(princ)
)
;;;------------------------------------

haivt
05-11-2006, 07:22 PM
Cám ơn Anh Lam đã chỉ cách lấy các điểm tạo nên 1 polyline. Trong thời gian đó Tôi cũng đã tìm được cách lấy các điểm đó (đoạn code bên dưới), mong Anh Lam xem và cho ý kiến về đoạn code này.

Làm như thế này bạn ơi!

(defun c:coord ( / e r)

&nbsp;&nbsp;&nbsp;&nbsp;(setq e (entget (car (entsel))))
&nbsp;&nbsp;&nbsp;&nbsp;;get the parent entity list

&nbsp;&nbsp;&nbsp;&nbsp;(setq r 1)
&nbsp;&nbsp;&nbsp;&nbsp;;set loop control number to 1

&nbsp;&nbsp;&nbsp;&nbsp;(while r
&nbsp;&nbsp;&nbsp;&nbsp;;while loop control is not nil, carry on looping

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq e (entget (entnext (cdr (car e)))))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;get the vertex entity list

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if (/= (cdr (assoc 0 e)) "SEQEND")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;if it is not "end-of-sequence

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(progn
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;do the following
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(princ (cdr (assoc 10 e)))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;print the co-ordinates

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );progn

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(setq r nil)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;if end of sequence, stop looping

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );if

&nbsp;&nbsp;&nbsp;&nbsp; );while

);

entnext cho phép bạn lấy đoạn thẳng tiếp theo trong Polyline

danthanh
06-11-2006, 09:57 PM
Vì tọa độ các điểm trong LWPOLYLINE kiểu mới được đánh dấu là (10 x y) nên tôi xin trình bày phương pháp lấy tọa độ điểm trong LWPOLYLINE như sau:
1. Chọn PLINE bằng entsel (setq ent (entsel))
2. Lấy mã DXF bằng entget (setq ent1 (entget (car ent)))
3. Lấy chiều dài list DXF đó bằng hàm length (setq n (length ent1))
4. Tạo 1 list trống (setq elst (list))
5. Dùng hàm while (< i n) để nhặt các list con có mã 10 ở đầu (if (= (car (nth i ent1)) 10) thì append (cdr (nth i ent1)) vào elst
Như vậy bạn đã có 1 lst chứa danh sách các điểm trong PLINE rồi.

ksxdvt
10-12-2006, 09:59 AM
có ai có Visual Lisp nào có thể vẽ khung nhà có bố trí thép và các mặt cắt ko cho tui xin với vẽ thủ công mệt quá

Honey
11-12-2006, 07:34 AM
Bạn xin vậy không biết đâu mà cho cả. :mad:

ksxdvt
11-12-2006, 01:42 PM
co goi nao dung duoc thi cho

nong truong thanh
08-02-2007, 08:51 PM
cac anh co the chi cho em cach lay ra dien tich cua doi tuong vua duoc hatch in ra man hinh. lay du lieu dien tich dua vai hatch

Honey
14-05-2007, 02:20 PM
Anh Lam ơi, cho Mình hỏi Anh Lam có biết thuật toán lấy cao độ 1 điểm bất kỳ của lưới tam giác mà chương trình nova xuất ra không. Nếu Anh Lam biết chỉ mình với nha, cảm ơn nhiều.

tien2005
15-05-2007, 12:31 PM
Anh Lam ơi, cho Mình hỏi Anh Lam có biết thuật toán lấy cao độ 1 điểm bất kỳ của lưới tam giác mà chương trình nova xuất ra không. Nếu Anh Lam biết chỉ mình với nha, cảm ơn nhiều.

Thật ra thì mình không sử dụng nova nên không biết dữ liệu của nó như thế nào. Nếu Bạn muốn lấy cao độ 1 điểm bất kỳ thuộc mặt phẳng tạo bởi lưới tam giác thì Bạn có thể làm như sau:
- Viết phương trình mặt phẳng của lưới tam giác
- Lấy tọa độ của điểm cần xác định rồi thay vào phương trình mp sẽ tính được cao độ
Cách xác định phương trình mp chủ yếu là dùng định thức cấp 2. Sau đây là đoạn code mẫu của Tôi để tính toán san nền Bạn có thể tham khảo:


;************dinh thuc cap 2******
(defun DTC2 (A1 A2 B1 B2) (- (* A1 B2) (* A2 B1)))


;;***LAP CAC HE SO A B C D CUAA PHUONG TRINH MAT PHANG*****
(setq HSA (DTC2 (- #Y2 #Y1) (- #Y3 #Y1) (- #Z2 #Z1) (- #Z3 #Z1)))
(setq HSB (* (DTC2 (- #X2 #X1) (- #X3 #X1) (- #Z2 #Z1) (- #Z3 #Z1)) -1))
(setq HSC (DTC2 (- #X2 #X1) (- #X3 #X1) (- #Y2 #Y1) (- #Y3 #Y1)))
(setq HSD (* (+ (* HSA #X1) (* HSB #Y1) (* HSC #Z1)) -1))

(setq CDi (* (/ (+ (* HSA Xi) (* HSB Yi) HSD) HSC) -1))

Trong đó #x1, #y1, ...., #y3, #z3 là tọa độ của các điểm khống chế lưới tam giác, xi, yi là tọa độ mặt phẳng của điểm cần xác định. CDi là cao độ cần xác định.
Chúc Bạn thành công

Honey
15-05-2007, 04:58 PM
Xin lỗi bạn nha, vì mình chưa nói rõ nên bạn không hiệu Lưới không gian tam giác trong nova là lưới gồm các tam giác vẽ bằng pline. Cái minh không biết là làm thế nào để nhận biết diểm mình chọn nằm trong tam giác nào và cách chọn tam giác đó để lấy cao độ các điểm chuẩn nội sụy Nếu bạn biết chỉ mình giụp Cảm ơn nhiều, chúc bạn thành cộng

MAN2
16-05-2007, 12:36 AM
Thật ra thì mình không sử dụng nova nên không biết dữ liệu của nó như thế nào. Nếu Bạn muốn lấy cao độ 1 điểm bất kỳ thuộc mặt phẳng tạo bởi lưới tam giác thì Bạn có thể làm như sau:
- Viết phương trình mặt phẳng của lưới tam giác
- Lấy tọa độ của điểm cần xác định rồi thay vào phương trình mp sẽ tính được cao độ
Cách xác định phương trình mp chủ yếu là dùng định thức cấp 2. Sau đây là đoạn code mẫu của Tôi để tính toán san nền Bạn có thể tham khảo:


;************dinh thuc cap 2******
(defun DTC2 (A1 A2 B1 B2) (- (* A1 B2) (* A2 B1)))


;;***LAP CAC HE SO A B C D CUAA PHUONG TRINH MAT PHANG*****
(setq HSA (DTC2 (- #Y2 #Y1) (- #Y3 #Y1) (- #Z2 #Z1) (- #Z3 #Z1)))
(setq HSB (* (DTC2 (- #X2 #X1) (- #X3 #X1) (- #Z2 #Z1) (- #Z3 #Z1)) -1))
(setq HSC (DTC2 (- #X2 #X1) (- #X3 #X1) (- #Y2 #Y1) (- #Y3 #Y1)))
(setq HSD (* (+ (* HSA #X1) (* HSB #Y1) (* HSC #Z1)) -1))

(setq CDi (* (/ (+ (* HSA Xi) (* HSB Yi) HSD) HSC) -1))

Trong đó #x1, #y1, ...., #y3, #z3 là tọa độ của các điểm khống chế lưới tam giác, xi, yi là tọa độ mặt phẳng của điểm cần xác định. CDi là cao độ cần xác định.
Chúc Bạn thành công
Bạn làm ơn cho tôi hỏi đoạn mã lisp để vẽ mạng lưới tam giác từ tệp số liệu XYZ như thế nào nhỉ?

DINH XUAN PHUONG
05-06-2007, 02:07 PM
Cac bac oi em co 1 doan lisp de tao 1 dim do ty le 250 ban ve A3
(command "Dimdle" "1.1" )
(command "Dimdli" "7.0" )
(command "Dimasz" "1.1" )
(command "Dimexe" "1.1" )
(command "Dimexo" "0" )
(command "Dimblk" "Oblique" )
(command "Dimcen" "1.1" )
(command "Dimtxsty" "VN_A3" )
(command "Dimtxt" "2.5" )
(command "Dimlfac" "25" )
(command "Dimjust" "0" )
(command "Dimtad" "1" )
(command "Dimgap" "1" )
(command "Dimtoh" "off" )
(command "Dimtih" "off" )
(command "Dimfit" "5" )
(command "Dimtix" "on" )
(command "Dimdec" "0" )
(command "Dimtdec" "3" )
(command "Dimaunit" "0" )
(command "Dimunit" "2" )
(command "Dimzin" "1" )
(command "Dimclrd" "6" )
(command "Dimclre" "6" )
(command "Dimclrt" "7" )
(command "Dimrnd" "0" )
(command "Dimtofl" "on" )
(command "dimstyle" "s" "TL250_A3")
Cac bac co the them vao day 1 vai dong lenh de tao cho dim nay co 1 kieu khac khi no do goc duoc khong (do chieu dai la net ngach cheo, do goc la mui ten o 2 dau chang han). Cac bac giup em voi :eek:

longnh
13-06-2007, 02:53 AM
Tôi có xem qua một chút - Coi bộ đồng chí làm cũng kỳ công đây :D
Việc chèn Excel qua CAD bằng Past Spec - AutoCad entities rất dễ.
Từ bảng chèn đó chuyển sang 1 bảng thống kê có sẵn tiêu đề, hàng lối cũng dê chứ khó khăn gì. Chỉ scale reference là xong. Không khó không khó

cái này có vẻ hơi lạc hậu xong khi bắt đầu Pa ko dùng zoom, duy nhất chỉ pan hoạc Scoll. nếu lỡ Z ròi thì Z P. Đảm bảo các bảng trùng khit nhau.

Bản chất ở đây CAD vert ảnh WMF => cad Opject mà thằng WMF ==> chỉ có tỷ lệ chú không có toạ độ. nó căn cứ vào màn hình để đưa ra kích thước. Cad 2007 chưa dùng qua ko biet thế nào.

longnh
13-06-2007, 02:54 AM
Bác nào có ý tưởng về lệnh scale đối tượng của CAD theo hai chiều chưa, liệu có thể thực hiện được không. Tui đang nghiên cứu viết bằng Lisp nhưng ý tưởng trình bày...

cái này cứ Block no lai roi Vô tư.
xong lại bung nó ra.

longnh
13-06-2007, 03:07 AM
Em đang thắc mắc 1 chút, mong các anh chỉ dùm em:
Giả sử trong bản vẽ Cad em tạo 1 định nghĩa thuộc tính 1 Block "cao độ", em đã ghi các cao độ tại các điểm vào 1 bản vẽ. Bây giờ vì cao độ mốc giả định bị thay đổi lên 0.3 -> tất cả các cao độ tại các điểm khác thay đổi theo. Vậy những lệnh nào của Lisp giúp em có thể lấy ra được những thuộc tính của các Block ra rồi cộng thêm 1 lượng 0.3 nữa?

Em mò hoài mà ko biết, mong các anh giải nghĩa cụ thể từng dòng để em nắm được cách thức làm.

fil toàn bộ block
move 0,0,0 ==> 0,0,0.3
nên nhớ các giá trị block không thay đổi

còn nêu muòn nó thay thì load ra excel + them 0.3 ròi chen lại la OK

đòi hỏi chut kiên thức về SCRITP
Nếu bạnu gõ lệnh như thế nào. mà ban co' file text tương tụ nhu vậy tyhì khi dán vào của sổ lệnh là OK.
ví dụ:

l
0,0
10,10

copy cái đoạn trên dán vao no sẽ vẽ line từ 0,0 ==> 10,10

DINH XUAN PHUONG
13-06-2007, 08:24 AM
Cac bac giup em doan líp do voi, em can kip lam cac anh oi, giup em zi ma !

Anhca221
14-06-2007, 01:43 AM
trong cad 06 07 có lệnh dtexted để sửa text rất nhanh.Nhưng với cad 04 thì sửa text rất vất vả.Vậy có anh nào có lips để sửa text cho cad 2004 ko vậy,Em cảm ơn nhiều.

thanhnhan_kt
02-01-2008, 11:00 PM
Chào các cao thủ trong diễn đàn! Em đang tập toẹ viết mấy cái lisp mà vất vả quá, tìm mấy cuốn sách đọc thì thấy nội dung cư na ná nhau, sách dịch nên đọc nhiều lúc tức như bò đá, đọc 1 câu dài dằng dặc đọc xong chẳng hiểu nó viết cái gì??:confused: .
Em có một vài thắc mắc mong được các anh giải đáp dùm em:
1. Em viết đoạn mã sau:
(defun c:tinh()
(setq pd (getpoint "\nPls pick a point:"))
(Setq a (getreal "\nPl enter a:"))
(Setq b (getreal "\nPl enter b:"))
(setq c (+ a b))
(command "text" "j" "C" pd "2" "" c)
)
không hiểu sao đến khi in ra màn hình được một đống toàn số không đằng sau :o for Ex: a=3, b=5 Kq in trên màn hình "8.00000000" có cách nào khắc phục không ạ? (không muốn dùng biến integer)
2. Một câu liên quan: cấu trúc hàm Round (trong lisp) như thế nào? và có hàm roundup, rounddown như trong EXCEL không ạ?
Mong các bác giải đáp giúp, em xin cảm ơn!

Autocad2008
04-01-2008, 07:07 PM
Chào các cao thủ trong diễn đàn! Em đang tập toẹ viết mấy cái lisp mà vất vả quá, tìm mấy cuốn sách đọc thì thấy nội dung cư na ná nhau, sách dịch nên đọc nhiều lúc tức như bò đá, đọc 1 câu dài dằng dặc đọc xong chẳng hiểu nó viết cái gì??:confused: .
Em có một vài thắc mắc mong được các anh giải đáp dùm em:
1. Em viết đoạn mã sau:
(defun c:tinh()
(setq pd (getpoint "\nPls pick a point:"))
(Setq a (getreal "\nPl enter a:"))
(Setq b (getreal "\nPl enter b:"))
(setq c (+ a b))
(command "text" "j" "C" pd "2" "" c)
)
không hiểu sao đến khi in ra màn hình được một đống toàn số không đằng sau :o for Ex: a=3, b=5 Kq in trên màn hình "8.00000000" có cách nào khắc phục không ạ? (không muốn dùng biến integer)
2. Một câu liên quan: cấu trúc hàm Round (trong lisp) như thế nào? và có hàm roundup, rounddown như trong EXCEL không ạ?
Mong các bác giải đáp giúp, em xin cảm ơn!

Chào ban sau khi nghien cứu mình đã sửa lại như thế này
(defun c:tinh()
(setq pd (getpoint "\nPls pick a point:"))
(Setq a (getreal "\nPl enter a:"))
(Setq b (getreal "\nPl enter b:"))
(setq c (+ a b))
(setq c (strcat (rtos c 2 1)))
(command "text" "j" "C" pd "2" "" c))

Bạn tham khảo trong help của visualisp
(rtos, value [, mode, precision])
Edits the given value as a real number in the format specified by the mode and precision as defined by the analogous AutoLISP function. If mode and precision are omitted, it uses the current values selected with the UNITS command.

Thân ái :) chào bạn chúc vui vẻ

dungdce
04-01-2008, 07:45 PM
Thật ra vấn đề của bạn kô thể giải quyết triệt để bằng hàm rtos được. Lỗi trên là do biến hệ thống dimzin trong AutoCAD. Bạn tham khảo thêm trong phần Help của AutoCAD sẽ hiểu cơ chế và tính năng của biến này. LISP và AutoCAD system variable có liên hệ mật thiết nhau.

Thân.

thanhnhan_kt
04-01-2008, 08:19 PM
Chào ban sau khi nghien cứu mình đã sửa lại như thế này
(defun c:tinh()
(setq pd (getpoint "\nPls pick a point:"))
(Setq a (getreal "\nPl enter a:"))
(Setq b (getreal "\nPl enter b:"))
(setq c (+ a b))
(setq c (strcat (rtos c 2 1)))
(command "text" "j" "C" pd "2" "" c))

Bạn tham khảo trong help của visualisp
(rtos, value [, mode, precision])
Edits the given value as a real number in the format specified by the mode and precision as defined by the analogous AutoLISP function. If mode and precision are omitted, it uses the current values selected with the UNITS command.

Thân ái :) chào bạn chúc vui vẻ
Cảm ơn bác! đây là vấn đề đang làm em đau đầu mấy hôm nay! bác cho em hoi thêm 1 câu là có cách nào để làm tròn lên (roundup) 1 biến không, em đang rất cần,
Chúc bác vui khỏe!

daothuyspt
21-04-2010, 01:34 AM
Em mạn phép tham gia một chút các bác nha. Em thấy Autoslip này trong cuốn tự học Autocad 2008 của kĩ sư Thành Vinh cũng viết đó các bác ạ
Em là sinh viên ngành hàn nên cũng chưa tìm hiểu kĩ lắm các bác ạ

lhuvn
26-08-2010, 11:36 PM
Em mới học năm 3 thui,cad còn yếu lắm.mạo muội cho e hỏi các bác làm cách nào để luyện cad nhanh, và tốt không.ngoại trừ "bạn nên thường xuyên vẽ" mà em đã biết rồi.giúp em nha.thank you!

trieu chau
28-08-2010, 12:52 PM
mình cảm ơn chương trình fastcad

vuchan
11-10-2010, 04:29 PM
chào các bác nha
bác nào rành sử dụng lệnh Xref trong ÂCd chỉ cho em với
hỏi khắp các diễn đàn mà có ai biết đâu
thanks nha

dungksxdhd
28-10-2010, 10:53 PM
cam on ban thien !

cuncon90
18-11-2010, 03:31 PM
cam on bac rat nhieu

ruhungvang
30-03-2011, 01:11 AM
chào các bác nha
bác nào rành sử dụng lệnh Xref trong ÂCd chỉ cho em với
hỏi khắp các diễn đàn mà có ai biết đâu
thanks nha

-Lệnh Xref có tác dụng insert các bản vẽ con về một bản vẽ tổng hợp (BV thể hiện).Lệnh này thường dùng trong công ty thiết kế (Trưởng dự án có thể phân ra nhiều bản vẽ cho nhiều thành viên khi dùng lệnh này thì trưởng dụ án có thể cập nhật các BV từ các thành viên về bản vẽ tổng của mình.Các thành viên vẽ nét nào thì được cập nhật về bản vẽ tổng nét đo. và còn giảm được dung lượng bản vẽ
- Còn cách dùng:
Gõ lệnh Xref => Hộp thoại
chon biểu tượng : Attach Dwg
-chon đường dẫn đến file chứa bản vẽ con
rùi ok
- click biểu tượng refresh
chon Reload all references thì BV được cập nhật

kientrucnv
11-03-2012, 04:31 AM
Đây là 1 chương trình nhỏ do mình viết để tự dùng lấy, CT này dùng để hỗ trợ triển khai bản vẽ KC. Mong các bạn xài thử và cho ý kiến, mình kg viết được bộ cài đặt cho nên các bạn chịu khó tự cài lấy (đoc nội dung từ file huongdan.txt). Thank.

EM CÀI VÀO CAD 2007 ĐƯỢC NHƯNG SAO CÀI VÀO CAD 2012 KHÔNG ĐƯỢC VẬY ANH:mad:,FASTCAD CỦA ANH RẤT HAY,THANKS ANH!

Voquangtue
12-03-2012, 10:38 AM
Cảm ơn bác! đây là vấn đề đang làm em đau đầu mấy hôm nay! bác cho em hoi thêm 1 câu là có cách nào để làm tròn lên (roundup) 1 biến không, em đang rất cần,
Chúc bác vui khỏe!
Bài viết của bạn viết cách đây 4 năm rồi nhỉ?
Không biết bạn còn cần nữa không?
Đây là code


(defun roundup(so rnd)
(* (atoi (rtos (/ so (expt 10 rnd)) 2 0)) (expt 10 rnd))
)


thử :
Command: (ROUNDUP 1526253.25 2)
-> 1526300

Command: (ROUNDUP 1526253.25 1)
-> 1526250

Command: (ROUNDUP 1526253.25 3)
-> 1526000

các bác ơi các hàm thông thường của autolisp thì nói chung em chưa giỏi lắm nhưng cũng bít dùng tàm tạm. Nhưng em thấy giờ người ta hay dùng các hàm VLA, VLX lắm. nhiều trường hợp sử dụng các hàm vla hay vlx thì giải quyết rất nhanh chóng. Em cũng đã tìm hỉu trên mạng cũng đi lùng các quấy sách ở hà nội rồi mà không thấy ở đâu cả. Bác nào có hướng dẫn các hàm này chỉ cho em với (tiếng anh cũng được), em đã lùng hết đường láng, cầu giấy, nhà sách tiền phong kim mã, và lên nhà sách hoàn kiếm cũng kô thấy. Nếu có gửi cho em theo địa chỉ Tridungtecco2@gmai.com hoặc giới thiệu cho em nên mua quyển sách nào và ở đâu với

Quyển sách này ở trong Help
Gõ Vlide -> Nhấn F1 -> Là có sách để học rồi :)