Lisp nối các line thành polyline là tệp nhỏ được tải nhiều nhất trong nhóm lisp cơ bản của trang này. Bản cũ chỉ nói mỗi lệnh JF. Lần này gói đã được tải về, giải nén, đọc từng dòng mã, và mọi dòng nhắc trong bài đều đọc lại trên AutoCAD 2026 đang chạy thật. Cả nhóm lisp cơ bản gom ở bộ lisp AutoCAD tổng hợp.
Tóm tắt. Tệp có hai tên lệnh chứ không phải một: JF và PLJOINFUZZ. Nó ăn cả cung tròn và polyline có sẵn, không riêng đường thẳng. Có một bẫy nặng: nếu bạn chỉ chọn đúng một đối tượng, lisp vứt tập chọn đó đi và thay bằng toàn bộ bản vẽ. Tệp không có hàm bắt lỗi, nên bấm Esc giữa chừng là dòng lệnh câm luôn. Con số fuzz không phải công tắc bật tắt như nhiều nơi viết: đặt nhỏ hơn khe hở thì vẫn nối, nhưng đường của bạn mọc thêm một đoạn bắc cầu. Mật khẩu giải nén là xaydungso.vn.
Gói lisp nối các line thành polyline có gì bên trong
Tệp tải về từ Google Drive nặng 77.862 byte, mật khẩu giải nén là xaydungso.vn. Trong gói có kèm một ảnh JPG hướng dẫn đi tìm mật khẩu ở trang khác, bạn không cần dùng tới. Giải nén xong thì chỉ có đúng một tệp s091.ltopl.lsp, 1.155 byte, ngày tệp 31/05/2017.
Hai dòng đầu tệp ghi rõ xuất xứ: đây là lisp miễn phí lấy từ diễn đàn CADViet, chủ đề nối đường cong với đường thẳng. Nói ra cho sòng phẳng, và cũng để bạn biết đoạn mã này đã chạy ngoài đời gần mười năm chứ không phải thứ mới viết hôm qua.

Hình 1. Bản vẽ trước khi nối. Toàn đoạn thẳng rời, đầu nọ không chạm đầu kia, chọn cái nào chỉ được cái đó.

Hình 2. Cũng bản vẽ đó sau một lệnh. Các đoạn rời đã thành một đường liền, chọn một phát là dính cả tuyến.
Tên lệnh là JF, và còn một lệnh thứ hai bản cũ không nhắc
Mở tệp ra, hai dòng khai báo lệnh nằm ngay đầu:
(defun c:jf () (c:pljoinfuzz))
(defun c:pljoinfuzz (/ ss1 entLine objType oldcmdecho oldpeditaccept fuzz okObjects)
Trong AutoLISP, chữ đứng sau c: mới là lệnh gõ được vào dòng lệnh. Vậy tệp này cho bạn hai lệnh. PLJOINFUZZ là tên đầy đủ, còn JF chỉ là cái vỏ hai chữ gọi lại tên đầy đủ đó. Hai lệnh chạy y hệt nhau. Bản cũ của bài chỉ nói JF, nên ai quên mất cái vỏ hai chữ thì tưởng mình nạp hỏng.
Câu hỏi kế tiếp là hai tên đó có giẫm lên lệnh nào sẵn có không. Tệp acad.pgp của AutoCAD 2026 trên máy đã được mở ra dò: không có dòng nào khai JF. Ba bí danh gần nó là J gọi JOIN, PE gọi PEDIT, PL gọi PLINE. Nạp vào là dùng được ngay, không đụng ai.

Hình 3. Dòng nhắc riêng của lệnh JF, chụp từ bản cũ. Nó khớp đúng chuỗi trong mã nguồn: Fuzz distance <0>:. Đây là dấu hiệu tin được rằng ảnh cũ chụp đúng tệp đang phát hành.
Fuzz distance là con số quyết định nối được hay không
Cả lệnh chỉ hỏi bạn hai thứ: chọn đối tượng, rồi nhập một con số. Con số đó tên là fuzz distance. Nó trả lời đúng một câu: hai đầu cách nhau bao nhiêu thì vẫn coi như nên nối lại với nhau.
Đây vừa là chỗ hay hiểu sai nhất, vừa là chỗ bản cũ của bài bỏ trống. Bản cũ chỉ viết là nhập đúng các khoảng nối, không nói khoảng nối ấy là gì. Fuzz không phải khoảng cách giữa hai đường. Nó là ngưỡng mà phần mềm dùng để quyết định hai đầu mút nào đáng được coi là một.
Hình 4. Bốn tình huống với cùng một khe hở 5 đơn vị, dựng lại và chạy thử trên AutoCAD 2026. Ba dòng dưới ứng với ba dòng của bảng ngay sau đây.
Phép thử làm trên bản vẽ mới, mỗi lần một cặp đoạn thẳng gấp khúc đặt hở nhau đúng 5 đơn vị, kiểu nối để Both đúng như lisp ép sẵn. Con số phần mềm báo được chép từ tệp nhật ký, không phải đoán.
| Fuzz nhập vào | Phần mềm báo | Hình vẽ nhận được |
|---|---|---|
| 0 | 0 segments added to polyline | hai đoạn vẫn rời, không dính gì |
| 1, 2, 3 và 4 | 2 segments added to polyline | nối được, nhưng mọc thêm một đoạn thẳng bắc qua khe hở |
| 5 | 1 segments added to polyline | hai đầu được kéo dài cho gặp nhau, không sinh đoạn thừa |
Bảng trên nói một điều mà hầu hết bài hướng dẫn bỏ qua: fuzz không phải cái công tắc bật tắt. Số 0 là không nối. Số dương nhỏ hơn khe hở vẫn nối, nhưng đường polyline của bạn có thêm một đoạn bắc cầu mà bạn không đặt. Chỉ khi fuzz đủ lớn so với khe hở thì hai đầu mới được kéo dài cho gặp nhau và hình vẽ mới đúng ý. Vậy nên cứ đo khe hở bằng lệnh DIST trước, rồi nhập fuzz không nhỏ hơn số đo đó. Đổi lại, đừng nhập số hàng nghìn cho chắc ăn, vì khi đó những đầu mút chẳng liên quan gì cũng bị lôi vào nhau.
Bẫy nặng nhất: chọn một đối tượng là nó quét cả bản vẽ
Giữa thân lệnh có đúng một dòng này, và nó là dòng nguy hiểm nhất trong tệp:
(if (= (sslength ss1) 1) (setq ss1 (ssget "X" okObjects)))
Dịch ra tiếng người: nếu tập chọn của bạn chỉ có một đối tượng, lisp bỏ tập chọn đó đi và thay bằng kết quả của ssget "X". Tài liệu AutoLISP của Autodesk nói rõ chế độ "X" quét thẳng cơ sở dữ liệu bản vẽ, gồm cả đối tượng nằm trên lớp đang tắt, đang đóng băng, và cả những gì đang ở ngoài màn hình. Bộ lệnh gõ tắt để bật tắt lớp nằm ở lisp chuyển layer trong CAD.
Người viết lisp làm vậy cho tiện: chỉ tay vào một đường là nối cả bản vẽ. Nhưng nếu bạn không biết luật đó, một cú bấm nhầm lên đúng một đoạn thẳng sẽ gộp hàng trăm nét ở khắp nơi thành những đường polyline không ai muốn. Trên bản vẽ mặt bằng đầy trục và đường bao, đó là một mớ phải Undo.
Cách né đơn giản. Luôn chọn từ hai đối tượng trở lên. Muốn nối đúng hai đoạn thôi thì chọn cả hai, đừng chọn một rồi trông chờ lisp đoán ý. Và trước khi chạy trên bản vẽ đang làm dở, cứ lưu lại một lần cho chắc.
Nó nhận cả cung tròn, không riêng đường thẳng
Bộ lọc chọn đối tượng nằm gọn trong một dòng:
(setq okObjects '((0 . "LINE,ARC,POLYLINE,LWPOLYLINE")))
Bốn kiểu đối tượng được nhận: đoạn thẳng, cung tròn, polyline kiểu cũ và polyline nhẹ. Tên bài nói mỗi line là nói thiếu. Bạn quét trúng một cung tròn thì nó cũng vào cuộc, và đó chính là lý do lisp này hợp với bản vẽ trắc địa hay bản vẽ tuyến đường, nơi một tuyến gồm cả đoạn thẳng lẫn cung. Cái không nằm trong danh sách cũng đáng nhớ: spline và ellipse bị bỏ ngoài, quét trúng chúng cũng như không.
Có một chỗ vênh trong mã mà người dùng nên biết, vì nó biến thứ tự bấm chuột thành chuyện sống còn. Lisp nhìn đối tượng đầu tiên trong tập chọn để quyết định cách gửi lệnh. Đầu tiên là line hoặc arc thì nó gửi kèm một chữ Yes trả lời câu hỏi chuyển đổi. Đầu tiên là polyline thì nó không gửi. Rắc rối nảy ra khi tập chọn lẫn lộn: bạn bấm vào một polyline trước rồi mới quét thêm mấy đoạn thẳng, lisp im chữ Yes, còn phần mềm thì vẫn hỏi vì trong tập có đoạn thẳng. Từ đó cả chuỗi trả lời lệch đi một nhịp. Chuỗi lệch nhịp đó đã được dựng lại và chạy thử trên AutoCAD 2026 với một polyline cùng hai đoạn thẳng: phần mềm hỏi câu chuyển đổi, nhận được chữ J thay vì Yes, đáp lại Yes or No, please. rồi error: Function cancelled. Đếm lại vẫn đủ ba đối tượng, không cái nào được nối. Cách né: bấm vào một đoạn thẳng trước, rồi mới quét tiếp.
Tệp không có hàm bắt lỗi, và bạn sẽ thấy hậu quả ngay
Đầu lệnh, lisp cất hai biến hệ thống rồi đổi chúng:
(setq oldcmdecho (getvar "cmdecho"))
(setq oldpeditaccept (getvar "PEDITACCEPT"))
(setvar "cmdecho" 0)
(if A2k4 (setvar "PEDITACCEPT" 0))
Hai lệnh trả lại giá trị cũ nằm ở cuối thân hàm, và tệp không hề có hàm *error*. Hệ quả rất cụ thể: bạn bấm Esc lúc đang chọn đối tượng, hoặc lúc đang phân vân con số fuzz, thì hàm chết ngang và hai lệnh trả lại không bao giờ chạy tới. Bản vẽ ở lại với CMDECHO bằng 0, nghĩa là gõ lệnh gì cũng không thấy chữ hiện ra ở dòng lệnh nữa. Nhiều người tưởng phần mềm hỏng nên khởi động lại cho lành.
Chữa mất năm giây. Gõ CMDECHO, Enter, nhập 1. Rồi gõ PEDITACCEPT, Enter, nhập 0. Số 0 là giá trị mặc định, đã đọc trực tiếp trên máy cài AutoCAD 2026 sạch.
Còn một lỗi nhỏ dành cho ai định sửa mã: biến A2k4 bị quên trong danh sách biến cục bộ, nên nó ở lại làm biến toàn cục sau khi lệnh chạy xong. Không gây hại, nhưng bẩn.
Làm tay bằng PEDIT nếu bạn không muốn nạp lisp
Bản cũ của bài gọi mỗi dòng nhắc của PEDIT là một hộp thoại. Không đúng. Không có hộp thoại nào cả, tất cả là dòng nhắc trên dòng lệnh, và nếu bạn bật nhập liệu động thì chúng hiện thành ô nhỏ cạnh con trỏ. Dưới đây là nguyên văn từng dòng, chép từ tệp nhật ký của AutoCAD 2026 phiên bản 25.1.
| Bước | Dòng nhắc nguyên văn | Bạn gõ |
|---|---|---|
| 1 | Select polyline or [Multiple]: | M |
| 2 | Select objects: | quét chọn rồi Enter |
| 3 | Convert Lines, Arcs and Splines to polylines [Yes/No]? | Enter |
| 4 | Enter an option [Close/Open/Join/Width/Fit/Spline/Decurve/Ltype gen/Reverse/Undo]: | J |
| 5 | Enter fuzz distance or [Jointype] <0.0000>: | số fuzz, hoặc J để đổi kiểu nối |
| 6 | Enter join type [Extend/Add/Both] | E, A hoặc B |

Hình 5. Dòng nhắc đầu tiên của PEDIT. Ảnh chụp từ năm 2020 nhưng chữ vẫn khớp từng ký tự với bản 2026.

Hình 6. Mười tuỳ chọn ở bước 4. Đếm lại trên bản 2026 vẫn đúng mười và thứ tự không đổi: Close, Open, Join, Width, Fit, Spline, Decurve, Ltype gen, Reverse, Undo.
Lisp gói đúng chuỗi sáu bước đó vào một lệnh. Điểm khác duy nhất là nó luôn chọn kiểu nối Both, tức là gặp được thì kéo dài cho gặp, không gặp được thì chèn thêm một đoạn thẳng. Làm tay thì mặc định là Extend, muốn Both phải gõ thêm một bước.
PEDIT Join khác lệnh JOIN ở chỗ nào
Hai thứ này hay bị gộp làm một, kể cả trong bản cũ của bài, vốn không nhắc gì tới lệnh JOIN. Chúng khác nhau ở đúng một điểm sống còn: JOIN không có khái niệm fuzz.
Phép thử đã chạy trên máy. Vẫn ba đoạn thẳng gấp khúc hở nhau 5 đơn vị. Gọi lệnh JOIN lên cả ba thì phần mềm hỏi Select source object or multiple objects to join at once, chạy xong, đếm lại vẫn còn nguyên ba đối tượng kiểu LINE. Không nối được gì. Cùng bộ ba đó, PEDIT với fuzz 5 cho ra một đối tượng duy nhất.
Tài liệu Autodesk giải thích chỗ này: JOIN cho phép hở giữa các đoạn thẳng, nhưng chỉ khi chúng nằm đúng trên một đường thẳng. Ba đoạn gấp khúc thì không thoả nên nó bó tay. Còn muốn ra polyline từ nhiều kiểu đối tượng thì chúng phải nối tiếp nhau, đầu chạm đầu.
Hình 7. Chọn nhầm công cụ là mất công. Đoạn rời rạc có khe hở thì JOIN không giúp được, phải đi đường PEDIT hoặc lisp.
Một chi tiết nữa cho người thích chính xác. Kết quả nối ra là LWPOLYLINE, tức polyline nhẹ, không phải polyline kiểu cũ. Đó là do biến PLINETYPE trên bản 2026 mặc định bằng 2, đọc trực tiếp trên máy đúng là 2. Kiểu đối tượng sau khi nối cũng đã được đọc lại bằng mã và trả về đúng chữ LWPOLYLINE.
Nạp lisp nối các line thành polyline trên AutoCAD 2026
Nạp một lần bằng lệnh APPLOAD, bí danh AP, rồi trỏ vào tệp LSP vừa giải nén, các bước có ở bài cách load lisp trong CAD. Muốn nó tự nạp mỗi lần mở phần mềm thì cho vào mục Startup Suite ngay trong hộp thoại đó.
Bản 2026 siết chuyện nạp tệp ngoài chặt hơn hẳn thời bài gốc ra đời. Biến SECURELOAD mặc định bằng 1 và TRUSTEDPATHS để trống, đọc thẳng trên máy đúng như vậy. Với cấu hình đó chỉ thư mục cài đặt phần mềm mới được tin ngầm, còn tệp nằm trong Downloads thì lần nào nạp cũng bị hỏi. Hộp thoại tên đầy đủ là Security - Unsigned Executable File, có ba nút: Always Load, Load Once, Do Not Load. Chọn Load Once để dùng thử, chọn Always Load nếu bạn tin tệp.
Trường hợp khó chịu hơn là khi ai đó đã đặt SECURELOAD bằng 2. Lúc ấy tệp nằm ngoài thư mục tin cậy bị bỏ qua trong im lặng: không hộp thoại, không báo lỗi, gõ JF thì phần mềm bảo không có lệnh này. Người dùng tưởng tải hỏng nên đi tải lại, mà tải bao nhiêu lần cũng thế. Cách chữa là thêm thư mục chứa tệp vào TRUSTEDPATHS, hoặc hạ mức về 1 trong hộp thoại SECURITYOPTIONS.
Về AutoCAD LT: từ bản LT 2024 trở đi LT có chạy AutoLISP. Thứ LT không có là bộ Express Tools, nên lisp nào gọi hàm bắt đầu bằng acet- thì LT chịu. Tệp này không gọi hàm nào như vậy, cũng không gọi ActiveX, chỉ dùng các hàm lõi như ssget, getdist, getvar và command.
Tải lisp nối các line thành polyline
Lisp nối line và cung thành polyline, tệp s091.ltopl.lsp
Một tệp LSP dạng văn bản, hai lệnh JF và PLJOINFUZZ, nhận line, cung tròn, polyline cũ và polyline nhẹ.
- Định dạng LSP, mở bằng Notepad đọc được
- Dung lượng 1.155 byte
- Số tệp 1
- Ngày tệp 31/05/2017
Mật khẩu giải nén: xaydungso.vn
Đừng theo ảnh hướng dẫn nằm trong gói. Gói có kèm một ảnh JPG bảo bạn đi tìm mật khẩu ở trang khác. Đường vòng đó bỏ được rồi, mật khẩu in ngay trong khung tải phía trên. Xin nhớ mỗi gói trên trang một mật khẩu riêng, không có chuỗi dùng chung. Gói này mở bằng xaydungso.vn, chuỗi autocad123 không mở được.
Đoạn ghi hình dưới đây đi theo bài gốc và vẫn xem được. Nội dung là thao tác nối nhanh các đường line và polyline trong bản vẽ.
Lỗi thường gặp
| Hiện tượng | Vì sao | Làm gì |
|---|---|---|
| Gõ JF báo không có lệnh | Tệp chưa nạp, hoặc bị SECURELOAD bỏ qua im lặng | Nạp lại bằng APPLOAD, thêm thư mục vào TRUSTEDPATHS |
| Chạy xong không đoạn nào dính vào nhau | Bạn để fuzz bằng 0, hoặc bấm Enter qua dòng hỏi fuzz | Chạy lại và nhập một số dương, tối thiểu bằng khe hở |
| Đường nối xong mọc thêm đoạn thẳng lạ | Fuzz nhỏ hơn khe hở nên phần mềm chèn đoạn bắc cầu | Undo, đo lại bằng DIST rồi nhập fuzz không nhỏ hơn khe hở |
| Cả bản vẽ bị nối lung tung | Bạn chỉ chọn một đối tượng nên lisp tự quét toàn bộ | Undo, chọn lại từ hai đối tượng trở lên |
| Lệnh dừng ngang, báo Yes or No, please rồi Function cancelled | Tập chọn lẫn polyline với đoạn thẳng, thứ tự bấm làm lệch chuỗi trả lời | Chọn lại, bấm vào một đoạn thẳng trước rồi mới quét tiếp |
| Dòng lệnh không hiện chữ nữa | Bấm Esc giữa chừng, CMDECHO kẹt ở 0 | Gõ CMDECHO rồi nhập 1 |
| PEDIT không hỏi câu chuyển đổi nữa | PEDITACCEPT đang bằng 1 | Gõ PEDITACCEPT rồi nhập 0 |
| Nối xong đường bị vênh khỏi vị trí cũ | Kiểu nối Extend kéo dài đầu mút để chúng gặp nhau | Dùng kiểu Add nếu muốn giữ nguyên đầu mút |
Câu hỏi hay gặp
Lisp nối các line thành polyline có nối được cung tròn không?
Có. Bộ lọc trong mã nhận bốn kiểu đối tượng: LINE, ARC, POLYLINE và LWPOLYLINE. Vì vậy một tuyến gồm đoạn thẳng xen cung tròn vẫn gộp được thành một đường duy nhất. Riêng spline và ellipse thì không.
Nhập fuzz bao nhiêu là hợp lý?
Đo trước rồi hãy nhập. Dùng lệnh DIST đo khe hở lớn nhất giữa hai đầu cần nối, lấy con số đó nhích lên một chút. Đừng nhập bừa số hàng nghìn cho chắc ăn, vì khi đó những đầu mút ở tận đâu cũng bị kéo vào nhau.
Gõ PLJOINFUZZ và gõ JF có khác nhau không?
Không khác. JF chỉ là một dòng gọi lại PLJOINFUZZ, hai lệnh chạy cùng một đoạn mã. Gõ tên nào là tuỳ tay bạn quen.
Nối xong muốn tách trở lại thành từng đoạn thì làm sao?
Dùng lệnh EXPLODE, bí danh X. Nó phá polyline về lại các đoạn thẳng và cung rời. Lưu ý là bề rộng nét đặt riêng cho polyline sẽ mất sau khi phá.





















