Doop
Doop is an open-source multiplayer design canvas and design MCP for Claude Code, Codex, and any AI agent. Design side by side with agents — free in beta.
Trình xem bản vẽ Cad trên máy tính, điện thoại
Translation pending
DesignGitHub @dangdvdOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Bản Windows (cài như phần mềm, chạy offline, giao diện kiểu AutoCAD): xem HUONG-DAN-WINDOWS.md.
Ứng dụng web một trang: xem bản vẽ, đo khoảng cách (có bắt điểm), thêm ghi chú. Đọc DXF trực tiếp và DWG trực tiếp (qua LibreDWG biên dịch WebAssembly); ghi DXF (2000 → 2018) và DWG 2018 / 2013 / 2010 / 2007 / 2004 / 2000 ngay trong app. Sau lần nạp đầu, app chạy hoàn toàn offline và cài lên màn hình chính iPhone như một app.
A.docExt[k] = { get() } → khoá dx trong XRECORD DVDCAD_DATA (dvd-acad-dxf.js). Mở tệp: A._dxFile → apply(v); tệp không có dữ liệu → local() (localStorage theo tên bản vẽ).dvd-acad-x39.js:
e.trc = id nằm trong modelEntities nhưng bị bỏ khỏi ENTITIES khi ghi DXF / DWG (writeR2000, R12) — lưu riêng trong dx.trace = { list, ents }.dvd-acad-core.js: isHiddenB gọi A.hideHook (vết can đang đóng), isLockedE gọi A.lockHook (trước: khoá bản vẽ; sau: khoá vết can). drawEntity bọc để làm mờ (globalAlpha 0,3 / 0,45) và bỏ khi in.A.newProps bọc: vết can ở trước → đối tượng mới mang trc.dx.feed = { posts: [{ id, by, t, txt, at, rp, done }] }; bong bóng vẽ trong window.draw (toạ độ màn hình).A.plotRender(0, false, 'svg') cho từng layout → trang HTML (pan / zoom bằng transform), không cần thư viện ngoài.plotRender(…, true) → A.pdfBuild (nhiều trang) hoặc từng PDF + A.zipStore.dvd-acad-x40.js:
A.glbOf: gom theo màu, Z lên → Y lên (x, z, −y), mét (unitToMM / 1000); lưới mịn: pháp tuyến trung bình theo đỉnh, lưới phẳng: tách đỉnh theo tam giác. GLB = header 12 byte + chunk JSON (đệm khoảng trắng) + chunk BIN (đệm 0), chỉ số Uint16 / Uint32 tuỳ số đỉnh.A.html3D: nhúng vendor/three.min.js + dữ liệu lưới base64 (Float32 / Uint32) vào một trang.rec.comp = { pid: 'none' | 'slice' }, khối mang e.pid (khoá XDATA S3D); partMap gộp từ hình chiếu tổ tiên.dvd-acad-3d.js (A._secPart khi dựng mặt cắt): buildCaps bỏ khối 'none'; flatshot vẽ độ sâu khối 'none' ở lượt thứ hai không có mặt phẳng cắt, bỏ khối 'slice' (chỉ còn mặt cắt), và không áp cutAway cho cạnh của khối 'none'.vsk = id hình chiếu; đóng → rec.cut.pts / rec.det mới → regen (A._dvApi, dvd-acad-x19.js) cho hình chiếu đó và con cháu.dvd-acad-x36.js:
A.planarFaces(mesh): hàn đỉnh, gộp tam giác kề cùng mặt phẳng (BFS theo cạnh, cùng pháp tuyến và hằng số mặt phẳng), biên = cạnh có hướng xuất hiện 1 lần → vòng (vòng ngoài = diện tích lớn nhất).A.satOf: SAT 7.0 — body → lump → shell → face (plane-surface) → loop → coedge (forward / reversed, partner) → edge (straight-curve, tham số 0…L) → vertex → point. Mỗi bản ghi name $-1 -1 $-1 … (thuộc tính, lịch sử, mẫu).e.imp = các nét 3D; dvd-acad-3d.js vẽ qua A.extraEdges.A.hlHook gắn LineSegments (depthTest: false, nét đứt) dùng chung hình học cạnh, chỉ hiện ở kiểu Hidden.dvd-acad-x37.js — mặt NURBS k: 'nsrf', ns = { du, dv, nu, nv, U, V, P, W }:
A.meshOfExt (dvd-acad-3d.js gọi trước các kiểu khối); lưu khoá ns trong XDATA S3D.dvd-acad-x38.js:
markDiff (dvd-acad-x33.js) lưu dfo (lớp / màu gốc) trên bản sao đánh dấu; A._lastCompare.dvd:db, liên kết e.dbl = { t, k } (khoá XDATA dbl).dvd-acad-x34.js — DGN V7:
A.dgnVax).07 10 41 00 … (màu ở byte +8), cờ thuộc tính 0x0800.FF FD.08 09 FE 02, bảng màu, phần tử 2D (khung bao: số nguyên lật bit 31), attindx = (độ dài dữ liệu + 4) / 2, kết thúc FF FF.A.makeUnderlay('DGN', …); dvd-acad-x28.js nhận UL$DGN$.dvd-acad-x35.js:
applyZoom, view.offsetX/Y, A.prevView.view3D.state (az, el, dist, target); camera = target + dist·(cos el cos az, cos el sin az, sin el). Nhìn quanh giữ vị trí camera, dời target.dvd-acad-3d.js pointAt đọc A.snap3DMode().
POLYLINE có secl (name, pat, psc, col, flip).
dvd-acad-x32.js:
parseIGES tách các mục S / G / D / P (cột 73), tham số theo dấu phân cách của mục G, chuỗi Hollerith nH…, số mũ D.igesToEnts: ma trận 124 ghép lồng, đơn vị G14 (cờ 3 → tên đơn vị) đổi theo unitToMM().
planarSim: trục z → ±z, đồng dạng; lật → đảo chiều cung).e.nurbs (điểm điều khiển đã biến đổi + chữ ký bvSig) để xuất lại 126 đúng.earcut3. 144 cong: lưới ≥ 24 × 24, giữ tam giác có trọng tâm (u, v) trong biên tham số.meshEnt, srf: 1). Mặt của cùng khối DVDCAD (nhãn DE DVDSOLID + số phụ) gộp lại.igesWrite: S / G / D / P / T 80 cột, số thực dạng 1. / 1.E-7. Cung chiều kim đồng hồ trong 102 dùng ma trận 124 lật diag(1, −1, −1). Spline Catmull-Rom đều → Bézier bậc 3 → 126 (nút bội 3). Màu 314, lớp 406 dạng 3, kiểu nét DE trường 4.AutoCAD DXB 1.0\r\n\x1a\0; bản ghi 1 byte.
dvd-acad-x33.js:
IMAGE có e.ole (oid, name, mime, link, path, kind, w0 / h0, upd).
dvdcad-x33/ole.ole trong imgx.HPGAPTOL → A.hpGapTol(). dvd-acad-cmds.js closeGaps nối các đầu mút hở (bậc 1) gần nhau ≤ dung sai trước khi dò biên.dvd-acad-x30.js:
renderNow đặt kiểu Thực tế, áp môi trường, tăng renderer.setPixelRatio theo mức (1× – 3×), canvas.toDataURL.renderer.toneMappingExposure = 2^EV, THREE.Fog theo % khoảng nhìn, nền scene.background (màu / CanvasTexture chuyển màu); lưu dvd:render.POINT có light (thêm tgt, free, web, ies).parseIES: LM-63, TILT NONE / INCLUDE, cường độ mặt phẳng ngang đầu, góc chùm = 2 × góc lớn nhất còn ≥ 50% cực đại.dvd:mats (nhập vào A.MATS); vật liệu theo lớp dvd:matlayer (khối nhận có matL).A.uvMap(T, g, ts, e) với e.mapk (B / P / C / S) và e.mapsc. DXF S3D ghi mapk, mapsc, matL.dvd:shots:<tên bản vẽ>. Cảnh 2D = tâm + tỉ lệ (view); cảnh 3D = az / el / dist / target. Chuyển cảnh nội suy (tỉ lệ theo log), easing.curvePts3 → điểm theo chiều dài, V.camTo; canvas.captureStream + MediaRecorder (WebM VP9 / VP8).dvd-acad-x31.js:
dvd:sheetsets / dvd:ssCur.{ k: 'ss', p, lay } (bọc A.fieldValue; số / tên tờ theo layout chứa trường). Cập nhật tại chỗ ở Model và mọi paperPrims.A.makeTable; tệp .dvdsst = JSON.dvd-acad-3d.js: dùng A.uvMap khi khối có mapk, tỉ lệ vân theo mapsc.dvd-acad-x24.js PdfCtx.setOC(lớp): /OC /OCn BDC … EMC. Đóng trước Q nếu q mở trước BDC. Đối tượng /OCG, /OCProperties trong Catalog, /Properties trong tài nguyên trang.dvd-acad-x25.js XpsCtx.setOC: <Canvas Name="L_<hex UTF-8>">.index.html: lượt vẽ gom nét theo cả lớp khi đích có setOC; hatch / ảnh gọi setOC. drawEntity được bọc (x28).dvd-acad-x8.js pdfToEnts: theo dõi beginMarkedContentProps (OC → getOptionalContentConfig().getGroup(id).name) → lớp; trả ocgs.dvd-acad-x28.js:
UL$PDF$… / UL$DWF$…. Thành viên có ull (lớp nền; *FRAME* = khung), nằm ở lớp hiện hành.vh. Đơn sắc lưu màu gốc ở ulc.ull / ulh / ulc trong XDATA của nét trong khối. Bộ đọc giữ nét ẩn có ull. Bộ ghi cho phép khối có nét ẩn khi là nền.xpsToEnts đọc Canvas (RenderTransform, Name), Path (Data / PathGeometry: M L H V C S Q A Z F), Glyphs. Thứ tự trang theo .fdoc.dvd-acad-x29.js:
pc (ảnh nhìn từ trên PNG cho bản in / AutoCAD). Điểm tương đối (Float32) + gốc o, lưu IndexedDB dvdcad-pc.drawImageEnt, vẽ điểm vào ImageData theo ma trận ảnh (bỏ qua khi đích là PdfCtx / SvgCtx).THREE.Points thêm vào view3D.scene.dvd-acad-x27.js:
SOLID3D k: 'mesh' (v đỉnh, f tam giác). Lồng gốc lưu ở e.ms = { lv, v0, f0, cr }; v / f là kết quả chia lv lần (A.meshSubdivide).t thuộc tam giác lồng floor(t / 4^lv), dùng để chọn mặt trên lưới đã làm trơn.A._last3D do cmdClick ghi).A.toMeshOpt(e, lv, prim): chia đều k² theo MESHPRIMITIVEOPTIONS;A.meshExtrude, A.earcut3, A.meshBoundaryLoops;A.meshSlice(V, F, n, d): cắt lưới bằng mặt phẳng, nối đoạn thành đường;A.surfPatch: earcut, chia tuyến tính, làm trơn Laplace giữ biên;A.meshCurvature: Gauss theo khuyết góc / diện tích, trung bình theo toán tử umbrella.SURFTRIM: chia tuyến tính tới cỡ ~1/60 đường cắt, bỏ tam giác theo trọng tâm, dời đỉnh biên mới về đường cắt; bản gốc giữ ở trim0.MESH / MESHPRIMITIVEOPTIONS: tuỳ chọn trong dvd:meshopt.dvd-acad-3d.js:
R3.setAnalysis('zebra' | 'curv' | 'draft' | null): ShaderMaterial (phản xạ hướng nhìn cho zebra, asin(n.z) cho góc thoát khuôn, thuộc tính acol cho độ cong); tuỳ chọn trong dvd:ana.ms.lv > 0 vẽ pháp tuyến mượt.srf, ms (bỏ ms nếu quá 15 000 ký tự); fromFaces dựng lại lưới từ lồng.dvd-acad-ui.js: thẻ ribbon mesh / surface trong không gian 3D Modeling.acet-*, bảng tra khối độngdvd-lisp5.js (nạp sau dvd-lisp4.js): 116 hàm acet-*.
acet-error-init / -restore lưu và trả biến hệ thống, có *error* riêng.acet-ss-*: tập chọn gộp / trừ / giao, -drag-move / -rotate / -scale.acet-geom-*: khung bao, véc tơ, điểm trong đa giác.acet-insert-attrib-get / -set, acet-ui-* (hộp thoại A.dialog), acet-reg-* (localStorage).dvd-acad-x26.js: lệnh Express Tools.
ATTOUT / ATTIN: tệp tab, cột HANDLE = grp của bản chèn.SUPERHATCH: lát A.instBlock; một ô được giữ khi tâm và 4 góc nằm trong vòng A.hatchClosedLoop (tối đa 4000 ô).PLT2DWG: A.hpglParse đọc PU / PD / PA / PR / SP / CI, 0,025 mm mỗi đơn vị.MKSHAPE: ghi .shp, nạp bằng A.shapeLoadFile.RTEXT (A.rtextUpdate, DIESEL A.diesel), FASTSEL (đặt selEnts sau khi lệnh kết thúc).BTABLE: hàng lưu trong dvd:dynblk › lookup.rows, áp dụng bằng A.dynSetState. Các bí danh B* chuyển sang BPARAMETER / DIMCONSTRAINT / BVHIDE / WBLOCK / XCLIP.dvd-lisp4.js:
Reactor (type, data, reactions, owners); fire() gọi hàm phản hồi bằng setTimeout + runTop (không chặn lệnh, tránh lặp quá 3 tầng).
Móc vào: A.run (lệnh: WillStart / Ended / Cancelled / Failed), A.commit (acdb Appended / Modified / Erased, object-reactor của đối tượng sở hữu), SETVAR, dblclick / contextmenu trên #cv, DVDLisp.evalToString (c:), QSAVE / SAVE / SAVEAS / SAVEDWG.VObj kind com (ref.cls); các builtin VLAX-GET/PUT-PROPERTY, VLAX-INVOKE(-METHOD), VLAX-GET/PUT chuyển sang comGet / comPut / comCall khi là đối tượng COM.
Excel giữ ô trong Map("r,c"), xlsxBlob() ghi SpreadsheetML tối giản (inlineStr / số / công thức, độ rộng cột) đóng gói bằng A.zipParts; FSO đọc / ghi DVDLisp.fs.vlax-import-type-library: tiền tố tự đặt sinh hàm …get-X / …put-X / …X khi tra G.A.dialog.dvd-lisp.js getv: ký hiệu bắt đầu bằng : tự trả về chính nó (từ khoá reactor, :vlax-true).dvd-addins.js:
installBundle (PackageContents.xml: ComponentEntry ModuleName / LoadOnAutoCADStartup / LoadOnCommandInvocation / Commands); lệnh giả stubCmds cho phần .dll / .arx / .fas; dvd:bundles;APPAUTOLOADER, MENULOAD (mnuToCui: ***POPn, -> / <-, [--] → cấu trúc .dvdcui), MENUUNLOAD; A.cuiLoadFile được bọc để tự nạp .mnl cùng tên;NETLOAD / ARX / VBA* / SECURITYOPTIONS.dvd-acad-dlg.js OPTIONS: tab Tệp (thư mục hỗ trợ, dvd:trusted = TRUSTEDPATHS, gói đã cài).dvd-acad-core.js inputImpl: bỏ _ đầu tuỳ chọn (trừ lời nhắc chuỗi không khớp tuỳ chọn); matchKw khớp thêm tên tuỳ chọn tiếng Anh (từ điển DVD_I18N_EN).dvd-lisp.js (command): A.fromLisp() (lệnh đang do LISP điều khiển), giữ - ở tên lệnh, HATCH → LISPHATCH (lời nhắc cổ điển), không tự Enter sau tên đối tượng khi LISP đã có "", A.input(s, { lisp }) (TEXT một dòng), chờ ô soạn chữ (A.textEditing); VL-CMDF trả T.-HATCH / LISPHATCH (cmds), -ARRAY (cmds), -ATTDEF (dlg), -TABLE + A.makeTable (ext), -WBLOCK (x6), CHANGE riêng (x6), LEADER cổ điển (more); -INSERT S / R / *TÊN (cmdline); POINT một điểm, BREAK chọn bằng tên đối tượng (cmds).dvd-lisp3.js: GETVAR / SETVAR (COMP tính động, DEF mặc định, biến điểm → danh sách); XDATA e.xd = [[app, [[mã, giá trị]…]]…] (REGAPP, ENTGET apps, ENTMOD / ENTMAKE -3, TBLSEARCH APPID / STYLE / LTYPE / DIMSTYLE); SSGET lọc cây logic theo entget (-4, -3, 410), WP / CP / F; ENTMAKE HATCH / DIMENSION / BLOCK…ENDBLK (A.makeBlock 'retain') / INSERT 66 + ATTRIB…SEQEND; ActiveX qua DVDLisp.ax (XGET / XPUT / XCOLL nối thêm vào getProp0 / putProp0 / collItems của dvd-lisp2.js).dxf xd()), đọc ở entExtra (bỏ ACAD / AcDb* / AcCm* / DVDCAD), giữ qua transformPrim; DWG ghi EED (thêm điểm 1010–1013) và bản sao XD: trong khối riêng DVDCADX1 để DVDCAD đọc lại (dvdApplyX).dvd-lisp2.js (nạp sau dvd-lisp.js, dùng DVDLisp.ext = BI / G / ev / withBindings / kiểu dữ liệu…):
DVDLisp.fs (IndexedDB dvdcad-lispfs, tên tệp không phân biệt hoa thường): findfile, load (tìm trong kho trước; .fas/.vlx báo rõ), autoload (đăng ký lệnh, nạp khi gõ), open/read-line/write-line/close (lớp LFile), vl-file-*, getfiled.dclParse (định nghĩa, kế thừa, tham chiếu, @include) + base.dcl rút gọn (ok_cancel…, nhãn nút theo ngôn ngữ giao diện); build() dựng HTML (cột / hàng / khung, 1 ký tự ≈ 7,2 px); start_dialog trả Promise, sự kiện → action_tile chạy trong withBindings($key $value $reason $data $x $y); translate="no" để chữ của LISP không bị tự dịch.VObj (app / doc / space / util / coll / item / ent), Variant, SArr; getProp / putProp (thuộc tính đúng / sai ↔ :vlax-true / :vlax-false); METHODS; tên vla-get-X / vla-put-X / vla-X sinh khi tra G. Biến đổi dùng A.xformEnt(e, M) (ma trận a b c d e f); Offset dùng G.offsetEntity (chọn phía như AutoCAD); khối dùng A.instBlock.pathOf gom đoạn thẳng / cung (cả cung của đa tuyến theo bulge), tham số: đoạn thẳng = khoảng cách, cung / tròn / elip = góc, đa tuyến = chỉ số đỉnh.grread (bắt pointerdown ở pha capture của window, trước .stage), grdraw/grvecs, tblnext/tblobjname, entmake INSERT + entmakex, textbox, cvunit, registry / cfg (localStorage), acet-* hay dùng, vlr-* (chưa phát sinh sự kiện).DVDLisp.startup(suite): acad.lsp → acaddoc.lsp → *.mnl → Startup Suite → S::STARTUP.dvd-addins.js: Nạp cả thư mục… () / gói ( từ ) → (tệp hỗ trợ vào kho, chọn nạp + Startup Suite, liệt kê bị bỏ qua); giải mã UTF-8, sai thì Windows-1258; lớn chỉ giữ trong kho (); lệnh .LS.layTP + LAYER_TP (đã dùng sẵn trong tpOf); A.layerTP(n), A.setLayerTP(n, %); bảng Lớp (cột Độ trong suốt), -LAYER › TR, LAYERSTATE, đổi tên lớp.
1001 AcCmTransparency / 1071 0x02000000 | alpha (APPID ghi thêm); đọc: layerTpOf(g).obj(T.LAYER, h, r)). Đọc: libredwg-web bỏ EED của bảng lớp → dwgLayerTpRaw(lib, ptr) đọc thẳng cấu trúc LibreDWG:
dwg_dynapi_common_value(tio, 'num_eed' | 'eed'), mỗi Dwg_Eed 40 byte (BS size @0, handle value @16, raw* @36); handle APPID qua dwg_object_get_handle_object(o).value (BigInt → Number); trong raw tìm mã 71 + RL.x16): hộp chọn định dạng (DWG 2018 → 2000 qua A.dwgNative(ents, { version, layouts: true }), hoặc DXF), nén bằng A.zipParts (deflate-raw); -ETRANSMIT; opt.noSave trả Blob (kiểm thử).x11 rcModify): projPath chiếu điểm lên đường dẫn mây (e.rcv), walkPath đi tiến giữa hai vị trí; mây kín chọn phía bỏ theo độ dài cung tiến; dựng lại bằng cloudFromPath giữ cung min / max / kiểu.x14): chế độ Cung — cung tiếp tuyến (tâm = S + n·|c|²/(2c·n)) hoặc 3 điểm (đường tròn ngoại tiếp), chia 5°; seg lưu số điểm mỗi lần nhập để Hoàn tác.cmds extendPolyArc): đoạn đầu / cuối là cung (bulge b): tâm = trung điểm + pháp tuyến trái · c(1−b²)/(4b); giao đường tròn đầy với ranh giới, lấy góc gần nhất theo chiều kéo, bulge mới = tan(θ'/4).dvd-acad-x25.js — XpsCtx extends SvgCtx: lệnh vẽ canvas → XAML của FixedPage (đơn vị 1/96 inch = px CSS):
đường / Bézier → <Path Data="F1 M… L… C… Z"> (F1 = nonzero, mặc định XPS là even-odd), nét đứt StrokeDashArray theo bội số bề dày, cắt → <Canvas Clip>,
gradient → LinearGradientBrush / RadialGradientBrush (MappingMode Absolute + Transform), ảnh → phần PNG + ImageBrush, chữ → bản ghi, nối phông lúc đóng gói.A.dwfxBuild(pages, info): chữ → <Glyphs Indices="gid,advance…" FontUri> với phông nhúng (A.pdfSubset(F, used, true): cắt glyf/loca, giữ cmap / name / OS/2 / post để phông nạp được như phông thường);
gói OPC: [Content_Types].xml, _rels/.rels (fixedrepresentation → FixedDocumentSequence.fdseq, documentsequence → DWFDocumentSequence.dwfseq, core-properties),
dwf/documents/<id>/manifest.xml (section com.autodesk.dwf.ePlot, tài nguyên "2d streaming graphics" = trang .fpage), descriptor.xml (ePlot:Page, Paper mm). ZIP nén deflate-raw (A.zipParts).plotRender(…, 'xps') → R.xps; thiết bị dwfx trong PLOT; PUBLISH pbTo = dwfx..NET XpsDocument (WPF, powershell -STA) mở tệp DWFx của kiểm thử nhanh, đếm trang + Glyphs (ToGlyphRun nạp phông nhúng), vẽ trang 1 ra PNG.A.plotPrnOpts(dev) (Thuộc tính… → PS.prn[dev]): color, duplex (simplex / longEdge / shortEdge), dpi, collate → print:svg → webContents.print({ color, duplexMode, dpi, collate }).plotPreview(onPlot) (dvd-acad-more.js, A.plotPreview, lệnh PREVIEW): plotRender(0, false, 'svg') → SVG đặt vào lớp phủ toàn màn hình;
camera {x, y, s} đổi viewBox (không co giãn ảnh → luôn sắc nét). Lăn chuột zoomAt, kéo = Pan, chuột giữa = Pan, Zoom thời gian thực, Zoom Window (zoomRect), Zoom Original (fit), chụm hai ngón.
Vùng bản vẽ translate="no" để bộ dịch giao diện không đổi chữ trong bản vẽ.PAPER_SIZES sinh từ bảng ISO A / B / C, ANSI, ARCH (+ full bleed, expand), JIS, Legal: mỗi khổ có media (tên chuẩn AutoCAD), mg (lề mặc định), grp (nhóm trong <optgroup>).
A.paperMedia(k) / A.paperFromMedia(tên) đổi qua lại; khổ A3 nay ghi ISO_A3_(420.00_x_297.00_MM) (full bleed là FB_A3).DEVICES thêm pdfgd, pdfwm, defprn; máy in Windows đã cài = sys:<tên>.
desktop/main.js: print:list (webContents.getPrintersAsync()), print:svg (cửa sổ ẩn nạp trang SVG → webContents.print({ silent, deviceName, copies, pageSize µm, landscape, margins none })).
preload.js: dvdDesktop.printers(), dvdDesktop.printSVG(o). Thiết bị sys: / defprn → doPlot('sys'); trình duyệt (không có cầu nối) → hộp in.renderForPDF(paper, region, vec) (index.html) vẽ vào DVDAcad.PdfCtx thay canvas; pagesToPDF(pages) ghép bằng pdfBuild. PUBLISH bản cũ (x2) cũng dùng plotRender(…, true).dvd-dwg.js pack2007(secs, o) — vỏ tệp AC1021 (kiểm từng byte với tệp AutoCAD trong bộ thử LibreDWG):
rep lần, RS(255,239) xen kẽ.seed2(len), đảo bit cuối); trang dữ liệu + bản đồ = Jones 0xAD93D23594C935A9 phản xạ, hạt giống seed1(len).
Dữ liệu đọc theo khối 8 byte 6,7,4,5,2,3,0,1; phần dư 4…7 byte: 2,3,0,1 rồi tiếp theo thứ tự. Checksum trang = Adler biến thể cùng thứ tự.r21Comp: đoạn chữ nguyên đầu ≥ 8 byte; lệnh chép 2 byte (dài 3…14, cách ≤ 0x200), 3 byte (≤ 18, ≤ 0x2000), 4 byte (≤ 255, ≤ 0xFFFF); ≤ 7 byte chữ sau lệnh chép nằm trong 3 bit thấp. r21Decomp giải nén.fix2007(buf) (bọc dwg_read_data của libredwg-web): giải xen kẽ sẵn các trang mã 4 không nén (cỡ trang = cỡ mã RS) vì bản libredwg-web kèm theo chép thẳng các trang đó.desktop/test/dwg2007-info.js (kiểm CRC / checksum từng trang), desktop/test/dwg2007-repack.js (đóng gói lại tệp 2007 của ODA bằng pack2007, có các biến thể để tách lỗi).A.plotVecQuant(ô) (dlg4) → SvgCtx opt.q: màu (trộn giấy trắng nếu trong suốt) → màu gần nhất của bảng ACI / đen trắng;
màu kiểu in bật dither, không có trong bảng → <pattern> Bayer 4×4 trộn 2 màu gần nhất (ô 0,254 mm); plotColor ghi lại màu nào thuộc kiểu in tắt dither; ảnh → Floyd–Steinberg.vendor/lff/*.lff (LibreCAD, GPL v2+). x23: parseLFF() đọc tệp:
x,y và cung x,y,A<bulge>, bulge áp cho đoạn từ đỉnh trước tới đỉnh này.C<mã>. Chữ hoa cao 9 đơn vị. Khoảng chữ 1.2 đơn vị, khoảng trắng = WordSpacing.altFont() được gọi trong fontsOf() khi tệp .shx chưa nạp: txt → standard, simplex, romans, romand, iso*, italic → italicc, còn lại theo FONTALT (localStorage dvd:fontalt).lffGlyph() ghép dấu tiếng Việt từ NFD: chữ gốc (dùng â / ê / ô / ă của phông nếu có) + dấu nét đơn; dấu móc của ơ / ư; gạch ngang của đ / Đ.vendor/fonts/Liberation*.ttf (SIL OFL 1.1). x24 bundled() luôn thêm một phông này vào cuối chuỗi phông của PDF (Serif nếu họ phông giống Times).A.SvgCtx(w, h, { flip, imgMax }): kế thừa PdfCtx (trạng thái, ma trận, dựng đường), ghi phần tử SVG:
path (stroke / fill / clip-path lồng theo save / restore), text (matrix + text-anchor + độ lệch chân chữ), image, linear / radialGradient.toSVG(Wmm, Hmm) trả SVG theo mm.plotRender(…, 'svg') → R.svg. printSVG() in qua iframe với @page đúng khổ.dvd-acad-x24.js (nạp sau x23, có trong cache của sw.js).A.PdfCtx(w, h, f, { flip, imgMax }): ngữ cảnh vẽ giả lập CanvasRenderingContext2D. draw() vẽ vào đây như vào canvas:
rect / fillRect / clearRect (giấy trắng), clip, save / restore → q / Q.globalAlpha + rgba → ExtGState, gradient → Shading kiểu 2 / 3, drawImage → XObject RGB nén + SMask.fillText ghi lại (font, canh lề, alphabeticBaseline đo bằng canvas thật). Ghép phông lúc xuất (bất đồng bộ).A.pdfBuild(pages, info):
W, ToUnicode để tìm / chép chữ. Phông CFF nhúng dạng FontFile3 / OpenType.CompressionStream. Ký tự không có trong phông đầu thì lấy phông sau trong chuỗi (phông của chữ → Arial → Segoe UI → …). Không có phông nào thì đoạn chữ thành ảnh độ phân giải cao.A.pdfFontSource (móc thử nghiệm) → dvdDesktop.font(family, bold, italic) (Electron) → Local Font Access (chỉ khi đã có quyền).
font:find trong main.js dò thư mục phông của hệ thống, đọc bảng name (ID 16/17 hoặc 1/2, cả .ttc) và chỉ trả tệp phông.plotRender(dpi, preview, vec):
vec = true vẽ vào PdfCtx: không dither / giảm màu. Lộn ngược bằng ma trận trang (unflip() trước dấu in).__txtBar / __txtSkip / __txtMax cho phép chữ nhỏ / lớn vẫn vẽ thành chữ.A.plotPDF(title) cho PLOT. PUBLISH ghép nhiều trang vector.A.PAPER_SIZES (ISO / ANSI / ARCH), A.paperMedia() (tên khổ AutoCAD, khổ tự chọn User_(W_x_H_MM)), .v.tw (radian), DCS = R(tw)·(P − đích):
index.html: _vpWorldC() đổi tâm nhìn DCS (12/22 hoặc VIEWCTR) + đích (17/27, targetPoint) về toạ độ mô hình.vpMatrix(v) (giấy = tâm + tỉ lệ·R(tw)·(P − tâm nhìn)), vpToModel / vpToPaper dùng chung cho buildPaperEntities, CHSPACE, VPSYNC, ALIGNSPACE.tw trong D.vps[i]. VPEDIT có cột Xoay nhìn.dvd-acad-dlg.js):
{ t, b, i, u, o, ff, f } thêm ff: phông riêng của đoạn (TrueType hoặc .shx).segW() đo bề rộng theo SHX (A.shxRun, A.shxLine của x23) hoặc theo canvas.drawRichText(ctx, e, px, T0) vẽ đoạn SHX bằng nét (stroke theo T0).A.richShxStrokes(e) trả nét khi mọi đoạn là SHX; A.shxStrokes gọi hàm này cho chữ có định dạng.A.mtextRuns đọc \F / \f; richPieces ghi {\Ftệp.shx;…} / {\fTên|b|i|c0|p34;…}.setFont() cho đoạn đó.dvd-acad-dxf.js ghi thiết lập trang có tên (A.pageSetups()) vào ACAD_PLOTSETTINGS. dvd-dwg.js mã hoá PLOTSETTINGS cùng phần AcDbPlotSettings với LAYOUT.libredwg-web.js đọc PLOTSETTINGS tại tio − 8: cùng bố cục phần plotsettings của LAYOUT, đã đối chiếu với gh109_1.dwg (AutoCAD 2013, bộ thử libredwg).psFrom() (x22): cờ 16 + mã 75 = 0 → vừa khổ giấy; cờ 16 với mã 75 khác 0 → tỉ lệ theo 147; không có cờ 16 → tỉ lệ 142 : 143. Mã 74 = 0 là Display.cvPlace() đặt #cv và 2 lớp phủ (#dvdOvS, #dvdOvC) vào ô của bản vẽ hiện hành (), rồi gọi và giữ tâm nhìn.dvd-acad-x23.js (nạp sau dvd-acad-x22.js, có trong cache của sw.js).A.parseWMF(buf, { wire, wide }):
lfCharSet → TextDecoder (163 = windows-1258, chuẩn hoá NFC).window._dvdBlocks (src: 'file') rồi A.instBlock.dvd-acad-x19.js):
rec.cut = { pts, type: 'F' | 'H' | 'O' | 'A' }; bản 5.15 { a, b } vẫn đọc được.sectionPlan(rec, par) chia thành các dải; mỗi dải gồm mặt phẳng cắt hoặc không cắt, cùng khoảng [lo, hi] theo trục dọc đường cắt.d / u quanh par.d (Rodrigues), trải phẳng bằng độ dời off.shootSection() chụp từng dải bằng shootOn một mặt phẳng, rồi cắt nét theo dải và cắt vùng bằng Sutherland–Hodgman. Biên vùng chỉ vẽ cạnh thật (edges).parseFont() đọc shapes 1.0 (hình 0 = above / below / modes), unifont (int32 số hình, mã 2 byte) và bigfont (dải mã đầu, bảng chỉ mục 8 byte; bỏ tiền tố mã 2 byte).runGlyph() dịch mã 0–14. Mã 7 lấy 1 byte, 2 byte (unifont) hoặc dạng mở rộng của bigfont.A.shxText(ctx, e, size, col, T0) (gọi trong drawEntity, bỏ qua chữ rich text), A.shxExtent (dùng cho textExtent), A.shxStrokes (vecWalk, TXTEXP).e.ff = 'romans.shx' và e.ffb (bigfont), lấy từ STYLE mã 3 / 4 khi đọc DXF và từ font / bigFont của DWG. shxOfStyle() bỏ qua phông VNI / TCVN vì đã giải mã sang Unicode.dvdcad-pro (shxf:<TÊN>, shxf:list).dvd-acad-dlg4.js: dvd-acad-x18.js … dvd-acad-x22.js (có trong danh sách cache của sw.js). Ribbon có thêm tab layout (Bố cục) trong cả 2 không gian làm việc.dvd-acad-x18.js (Smart Blocks):
simM), rồi so khớp từng đoạn theo dung sai.A.bconvertSearch(name, src, opt, pool) / A.bconvertApply(name, src, list). Cài đặt lưu ở dvd:bconvert.dvd-acad-x19.js (hình chiếu):
A._dvRegistry lưu trong DVDCAD_DATA (dvw). Nét mang XDATA dvw = id hoặc id/a (chú thích vẽ trên hình cha).d' = k·sh·r, dọc d' = k·sv·u, với k = −1 (góc chiếu thứ nhất) / +1 (thứ ba). Hình có hướng nằm ngang giữ trục Z hướng lên.VIEWUPDATE giữ được vị trí đã dời; hình con dời theo hình cha.dvd-acad-3d.js flatshot(o) có thêm:
o.dir / o.up: hướng chiếu bất kỳ.o.hidden: trả out.hid (nét khuất).o.caps: mặt cắt đưa vào lượt chiều sâu.out.B = {r, u, c}: hệ trục của hình chiếu.setCutPlane(n, o): mặt cắt tổng quát, giữ phía n·(P − o) ≥ 0. buildCaps() gộp vùng cắt theo từng đối tượng.dvd-acad-x4.js (ràng buộc):
sym cho bộ giải.dvd:conset gồm fmt, show và ac {coin, hv, par, perp, tolD, tolA}.c.hide (DCDISPLAY) và c.ann (DCFORM, vẽ cả khi in).DCCONVERT tìm đối tượng tại điểm định nghĩa của kích thước.dvd-acad-x20.js:
*GEOMARK (POINT + CIRCLE + 2 LINE + TEXT) mang XDATA gmk {id, lat, lon, z, note}. / nằm trong .dvd-acad-dxf.js dynGraph(B, d): đồ thị đánh giá tổng quát (nút { t, h, i, id }, cạnh [từ, tới, số liên kết], danh sách vào / ra tự tính) cho tham số hiển thị, tuyến tính (BLOCKLINEARPARAMETER + BLOCKLINEARGRIP + UpdatedEndX/Y + BLOCKSTRETCHACTION: khung t > L0/2, LINE / LWPOLYLINE dời theo đỉnh, nét khác chỉ khi nằm trọn trong khung) và 2 tham số lật (BLOCKFLIPPARAMETER + BLOCKFLIPGRIP + UpdatedFlip / UpdatedBaseX/Y + BLOCKFLIPACTION chọn mọi nét, tham số / grip khác và các STRETCH như khối Door của AutoCAD; FLIP → STRETCH).
bm · S (không lật), *U = S · hình đã kéo; XDATA dfl: [sx, sy] → bộ đọc dựng bm = Mi · S.ACAD_ENHANCEDBLOCKDATA (giá trị đã đánh giá: điểm tham số sau lật, trạng thái lật, góc STRETCH) với mã 1071 cố định theo loại như tệp AutoCAD.dvd-dwg.js: mã hoá 6 lớp khối động mới (2 điểm: BS số liên kết + [BL id, TV tên] × 4, BL grip × 4, BS vị trí gốc; STRETCH: khung 2RD, nét + chỉ số điểm, BD hệ số, BD góc, RC cờ — theo IL của ACadSharp 3.8); sub(r, lớp) để biểu thức đánh giá không đọc nhầm mã 70 của AcDbBlockAction.A.imgFile(id, tên) (dvd-acad-pro.js) → tên ổn định tên_<id>.png|jpg; DXF ghi IMAGE (u / v của 1 điểm ảnh, fade, khung cắt đa giác theo toạ độ điểm ảnh gốc trên trái), IMAGEDEF .\tên, IMAGEDEF_REACTOR, ACAD_IMAGE_DICT, RASTERVARIABLES; A.lastImgFiles cho bản Windows (dvdDesktop.writeSide / readSide: chỉ thư mục của bản vẽ đã cấp quyền, chỉ đuôi ảnh) và ETRANSMIT. Đọc: acadImage(...) trong index.html (DXF: IMAGEDEF ở OBJECTS; DWG: db.objects.IMAGEDEF), _imgRefs → onLoad đọc tệp ảnh. libredwg-web.js: khung cắt IMAGE đọc là điểm 2D.PC3.print (máy in Windows) trong độ sâu màu; A.geomapPlotPrep(box, px) / A.geomapPlotDraw() (dvd-acad-dlg4.js) + A.plotMapPrep() (dvd-acad-more.js) — drawGrid của plotRender vẽ ảnh bản đồ của vùng in; drawMap cũng vẽ khi renderExport.dvd-acad-x3.js A.dwgFallback(ver): không có ODA thì bản gốc cùng năm, không có thì bản mới nhất ≤ năm đó (2007 → 2004).dvd-dwg.js: một bộ ghi cho 5 phiên bản (DVDDwg.dwgFromDxf(text, { version: 'R2018' | 'R2013' | 'R2010' | 'R2004' | 'R2000' }), A.dwgNative(ents, { version }), A.dwgVersions).
ACAD_EVALUATION_GRAPH, BLOCKVISIBILITYPARAMETER, BLOCKVISIBILITYGRIP, BLOCKGRIPLOCATIONCOMPONENT, ACDB_DYNAMICBLOCKPURGEPREVENTER_VERSION, ACDB_BLOCKREPRESENTATION_DATA (bố cục theo bộ đọc của ACadSharp, kiểm bằng tệp mẫu AutoCAD); từ điển mở rộng của INSERT; EED 1005; XRECORD điểm 3D / 1071.dvd-acad-dxf.js:
ACAD_GEOGRAPHICDATA của *Model_Space (DXF 2010+).A.dynStateCopy(list, 'default'), nét ẩn 60 = 1, XDATA AcDbBlockRepETag), mỗi bản chèn một *U (AcDbBlockRepBTag → khối gốc, INSERT xdict AcDbBlockRepresentation → AcDbRepData + AppDataCache / ACAD_ENHANCEDBLOCKDATA / XRECORD trạng thái); R2018 thêm đồ thị đánh giá 4 nút (tham số hiển thị ← grip → 2 thành phần vị trí grip). XDATA DVDCAD: dbn (tên khối gốc) trên INSERT, dvs / dyn trên nét trong khối.imgs, IMAGE → khung đa tuyến + imgx), vị trí địa lý (geo) trong DVDCAD_DATA.index.html (bộ đọc): cờ ẩn 60 / isVisible (nét ẩn không vẽ, trừ nét của khối động DVDCAD), AcDbBlockRepBTag → trueName, tham số hiển thị AutoCAD → dynVis (trạng thái theo XRECORD của INSERT hoặc theo các nét đang hiện) → window._dxfDynVis → định nghĩa khối động của dvd-acad-x5.js.dvd-acad-dlg4.js: / ; in giảm màu (Floyd–Steinberg quét rắn bò, bảng ACI 256 màu tra theo khối 32³, mặt nạ màu tắt dither), (PNG color type 3 + pHYs), .dvd-acad-dlg4.js (nạp sau dvd-acad-dlg3.js).openModal(o) đưa lớp phủ tĩnh (vd #txtBar của askText) xuống cuối body → nằm trên hộp thoại A.dialog đang mở (cùng z-index: 50).frozen_layers + clip_boundary. Đọc DXF: _h (handle) của đối tượng giấy, layerByH; đọc DWG: frozenLayerIds / clipBoundaryId (thêm vào convertViewport của libredwg-web.js). Kết quả gắn ở viewport.vx = { frz, cp }; window.vpExtra lấy bản riêng trên máy trước, không có thì vx của tệp.A.textOutline(e, { px, tol }): vẽ chữ ra canvas phụ bằng chính drawEntity, dò biên marching squares (nội suy theo alpha), Douglas–Peucker cho vòng kín → các vòng (ngoài + lỗ, tô evenodd). Dùng cho TXTEXP, clipEnt của EXPORTLAYOUT (HATCH txo), MSLIDE, HPGL/2.A.menuBarSet(menus), menu { t, items: [{ t, c } | { sep } | { t, sub }] }; dvd:cui.menus. CUIX: RibbonPanelSource / RibbonTabSource → tabs (rb: 1), SmallImage / LargeImage → cmds[].img (data URL) → DVDIcons['CUII_<lệnh>'] (<image> trong SVG). Nhãn của tệp CUI không qua bộ dịch (translate="no", it.nt).A.geodataParse(text), A.utmToLL(E, N, zone, south); GEOMAP vẽ trong drawGrid (dưới bản vẽ) bằng ô Web Mercator, khung toạ độ địa phương (mét / đơn vị bản vẽ, hướng bắc); ghi chú bản quyền OSM góc dưới phải.A.plotGeom() (khổ, vùng in, tỉ lệ, gốc) trong dvd-acad-more.js; A.hpglPlot() → { data, pens, ents }, thiết bị plt trong PLOT.parseDXF trả thêm layouts (LAYOUT trong OBJECTS; khối giấy qua mã 340 của BLOCK_RECORD vì 330 bị bỏ khi đọc) và paper (đối tượng mã 67 = 1 của ENTITIES, tách khỏi Model; VIEWPORT gom ở list.vports). dxfLayouts(r) dựng dwgLayouts giống buildLayouts của DWG; paper.lim = tờ giấy (khổ giấy thiết lập in, hoặc LIMMIN / LIMMAX), viền vpf không in.*Paper_Space* vào db.entities → dwgBuild lọc theo handle để Model chỉ còn *Model_Space.A.layoutFromFile(i) (fileDef: ps = đối tượng giấy của tệp, vps với n = vh × mmU / h, org gốc tờ giấy, frame: false, tb: false, from = tên layout tệp). installLayouts dựng lại tab từ ảnh chụp dwgLayouts._file: định nghĩa có from thay đúng chỗ, gone = đã xoá.
A.commit trong layout tệp tự chuyển (A.ensurePaperLayout); A.canEdit / A.editList coi layout tệp là sửa được.A.dxfR2000(ents, { layouts }), tự bật khi ents === modelEntities): mỗi layout một LAYOUT (40–45 khổ giấy, 10/20–11/21 giới hạn, 331 khung nhìn tổng), BLOCK_RECORD *Paper_Space / *Paper_SpaceN, VIEWPORT (ID 1 = tờ giấy), đối tượng giấy có mã 67. XRECORD DVDCAD1 thêm lay (định nghĩa layout) → A.seedLayoutDefs khi mở lại.dvd-dwg.js): thực thể VIEWPORT (kiểu 34) theo thứ tự trường của LibreDWG; LAYOUT ghi handle khung nhìn đang hoạt động.A.diesel(str); MODEMACRO (biến phiên, hiện ở #acMM trên thanh trạng thái); A.runMacro tính $M= trước khi tách lệnh; lệnh DIESEL.A.cuiRead(file) — giải nén zip bằng DecompressionStream('deflate-raw'), đọc MenuGroup.cui (MenuMacro, Toolbar, Accelerator, DoubleClickAction) → định dạng .dvdcui; A.cuiImportFile / A.cuiLoadFile.ltDash co mẫu theo A.entLen(e), khoá nhóm kèm hệ số), đầu / nối hình thoi ( đổi sang butt / bevel, tô mũi thoi).dvd-acad-dlg3.js (nạp sau dvd-acad-dlg2.js).def.ps (đối tượng giấy, giữ tham chiếu qua các lần dựng lại nhờ PSLIVE trong dvd-acad-pro.js; A.sheetPrims, A.saveLayoutQuiet).
A.commit trong layout tự tạo đổi tạm modelEntities sang danh sách giấy (A.withPaper), bước hoàn tác mang psLay; applyEdit áp lại vào đúng layout. Sửa khung nhìn (vpf + vpi) đổi def.vps.A.canEdit() / A.editList() cho bảng Thuộc tính (dvd-cmd.js). CHSPACE dùng scaleEnt / translateEnt theo tỉ lệ khung nhìn, một bước hoàn tác kiểu fn.A.dwgStdTables(buf) đọc bảng LAYER / LTYPE / STYLE / DIMSTYLE từ DWG qua LibreDWG; A.stdTablesOf(file) chọn DXF hay DWG.lt (kiểu nét in 0–30), es / js (đầu / nối nét), fs (kiểu tô 64–72), nd (tắt dither), pn / vp (số bút / bút ảo), na (tắt thích ứng), lwt (bảng bề rộng nét tuỳ chỉnh), af / sf (hệ số tỉ lệ chung).
ltDash trả mẫu nét in, nhóm nét mang cj (lineCap / lineJoin, window._plotCJ), drawEntity / drawHatch đặt mẫu tô (CanvasPattern) qua CanvasRenderingContext2D.prototype.fill.G.curveOf(e).sub(a, b) theo đa giác khung nhìn (lấy mẫu + chia đôi), hatch / vùng đặc bằng Sutherland–Hodgman (A.clipToRegion).view3D.setVS(P) ghi đè kiểu hiển thị (face, edges, edgeCol, opacity, shadow, bg); kiểu riêng lưu ở dvd:vsuser, kiểu đang dùng ở dvd:vscur.dvd:geo::<bản vẽ>, cập nhật dvd:sun; DXF thêm chú thích 999 DVDCAD-GEO {…} và $LATITUDE / $LONGITUDE / $NORTHDIRECTION / $TIMEZONE.A.slideMake() / A.slideParse() / A.slbParse() / A.slbBuild() (định dạng slide cấp 2, byte thấp trước).PATS._USER (mẫu tự định nghĩa: e.usp khoảng cách, e.udbl hai chiều), gốc mẫu e.porg (A.hatchOrigin, HATCHSETORIGIN), e.hanno chú thích, e.nassoc không liên kết, thứ tự vẽ (A.hatchDrawOrder). DXF ghi đúng mã 76 / 41 / 77 cho mẫu _USER.{ dbl, sp } (viền đôi) trong kiểu ô; khối trong ô tbld.cb['r,c'] = { name, src, sc, fit, rot, al } (TINSERT), dựng lại cùng bảng (_keep).A.plotPost(R, forPreview) chạy sau plotRender — in lộn ngược (PS.ud) và dấu in (PS.stamp, cài đặt dvd:plotstamp, nhật ký dvd:plotlog). Biến LOGINNAME.dvd:standards (bảng LAYER / LTYPE / STYLE / DIMSTYLE đọc từ DXF bằng A.dxfStdTables), cài đặt dvd:stdset, lỗi bỏ qua dvd:stdign; A.stdProblems() liệt kê lỗi, biểu tượng ⚖ trên thanh trạng thái.g (chuyển xám, color_policy bit 2) và d (mô tả kiểu) khi đọc / ghi .ctb; Plot Style Table Editor mới (A.plotStyleEditor).*CENTERMARK giữ cmk = { c, r, s, e, na } (+ cmi thứ tự nét); đường tâm *CENTERLINE giữ cln = { a, b, e, na }. Gói A.commit dựng lại khi đối tượng gốc đổi, cập nhật dữ liệu khi dấu tâm bị dời / xoay / co giãn.A.runWithFile(cmd, file) chạy một lệnh có hộp chọn tệp với tệp đã chọn sẵn (ATTACH). A.refeditLocal() lấy hình khối đang sửa ở toạ độ khối (BSAVEAS). A.textWin(title, text) cửa sổ văn bản (TEXTSCR, DBLIST).dvd:vsuser. Mọi hộp thoại còn kiểu cũ đã chuyển sang A.acw.dvd-acad-dlg2.js (nạp sau dvd-acad-dlg.js), dùng bộ dựng hộp thoại A.acw.A.TBS (localStorage dvd:tblstyle). Bảng mang ảnh chụp kiểu tbld.tss (+ ts tên kiểu, rs kiểu ô từng hàng, cs kiểu ô từng ô, tsf hệ số SCALE).
A.tblBuild dựng bảng theo kiểu: nền ô gộp vùng cùng màu, viền trong / ngoài theo kiểu ô, căn lề 9 vị trí, định dạng số (A.tblFmt). A.tblCellAt tìm ô theo điểm.A.countBlocks), trường đếm fld = { k: 'count', blk } tự cập nhật sau mỗi A.commit.A.scaleList / A.scaleName (SCALELISTEDIT), e.ascl (OBJECTSCALE), cờ vẽ e.avh khi ANNOALLVISIBLE = 0. Biến mới ANNOALLVISIBLE, CTABLESTYLE.e.url (+ urld chữ hiển thị, urlsub góc nhìn đích); XDATA lưu thêm urld, urlsub, ascl, gns, gdsc.A.onReqRes(req, v) mỗi khi một lời nhắc nhận giá trị; macro lưu ở dvd:actm, đăng ký thành lệnh theo tên. Script ngắt được (Esc / Backspace) và chạy tiếp (A.runScriptToks).e.gns = nhóm không chọn cả nhóm (A.expandGroups bỏ qua), e.gdsc mô tả; nhóm đặt tên dùng blk = '*G:<tên>' (CLASSICGROUP).A.gradFill vẽ 9 kiểu chuyển màu của AutoCAD; HS.gmode / HS.grad cho HATCH / GRADIENT; A.applyHatchEdit cho HATCHEDIT.dvd:userpar::<bản vẽ> và tham gia giải biểu thức ràng buộc.A.parseLin, A.defineLT), Hatch Edit.dvd-acad-dlg.js):
e.rt = [{ t, b, i, u, o, f }]; e.rtx = chữ lúc gán (chữ bị sửa ở nơi khác thì bỏ định dạng).A.drawRichText), khung bao (A.richExtent) và xuất DXF / DWG (A.richPieces).A.mtextRuns. Lưu / mở lại qua XDATA "DVDCAD" (rt, rtx, cols, mtp, mtwk).A.fieldDialog) và lệnh FIELD mới. A.fieldValue có thêm ngày tạo / ngày lưu, định dạng ngày kiểu AutoCAD (A.fmtDate), chữ hoa / thường, thuộc tính tuỳ chỉnh. UPDATEFIELD cập nhật cả trường nằm trong chữ.e.cols = { n, w, g, h, dyn }): mỗi cột xuất thành một MTEXT riêng. Các mảnh phụ mang colx và được bỏ khi mở lại.e.ud) và góc nghiêng (e.obl): vẽ, khung bao, DXF (51 / 71 & 4), DWG, kiểu chữ.A.mlineEnts).A.mln.parse, A.mln.write).A.battman): Edit Attribute có xem trước (hoàn tác khi Cancel) và Settings. Chế độ thuộc tính (ainv, acon, aver, apre, alock, aml) đi qua A.syncAtts. ATTDISP có thêm Bật (ON).A.inplaceText, A.textFinish, A.textSrc trong dvd-acad-dlg.js):
mtp) và tỉ lệ khung (mtwk) để sửa lại.A.getPoint với previewAlways).A.selectColor) cho COLOR và mọi ô chọn màu; -COLOR / -PURGE cho script, LISP gọi (command "COLOR" …) / (command "PURGE" …) chạy bản dòng lệnh.dvd:mlslib), kiểu đường đôi (dvd:mlstylelib, nắp đầu / cuối riêng capS / capE).A.dialog trong dvd-acad-cmds.js):
modeless cho bảng nổi (vẫn vẽ được phía sau).dvd-acad-dlg.js (mới):
dvd-acad-cmds.js):
A.dimStyles); sửa kiểu thì kích thước dùng kiểu đó dựng lại.A.ribbonCtx).$INSUNITS (7 = km, 10 = yard, 15 = decameter).dvd-dwg.js: bộ ghi DWG R2000 (AC1015) bằng JavaScript, chạy trong trình duyệt, điện thoại và bản Windows.
dvd-acad-dxf.js (A.dxfR2000), nên DWG giữ đúng những gì DXF giữ: bảng lớp / kiểu nét (cả kiểu nét có chữ, hình) / kiểu chữ / dimstyle / VPORT / APPID, khối + thuộc tính, DIMENSION (thẳng, chéo, góc 3 điểm, bán kính, đường kính), HATCH đặc và mẫu, LWPOLYLINE (cung, độ rộng), TEXT / MTEXT, SOLID / 3DFACE, ELLIPSE, XLINE / RAY, WIPEOUT, từ điển, LAYOUT, MLINESTYLE, XRECORD.DVDCADX1 giữa các section, vì bộ đọc WASM chưa đọc được EED của DWG 2000.A.dwgNative(ents) → Uint8Array; DVDDwg.dwgFromDxf(text, { bmp }) (chạy được trong Node để kiểm thử).SAVEDWG mặc định dùng bộ ghi gốc (từ v5t: DWG 2018, chọn 2013 / 2010 / 2004 / 2000 trong DWGSERVER; DWG 2007 qua ODA File Converter / máy chủ, không có thì ghi DWG 2004). SAVEAS / Ctrl+S chọn được *.dwg.INSERT.attribs); đọc khối DVDCADX1 của file do DVDCAD ghi.sample.dwg (10 nghìn đối tượng): mở → ghi DWG gốc → mở lại, giống hệt từng đối tượng so với mở lại bản DXF 2000; LibreDWG đọc mọi file không cảnh báo.desktop/test/smoke.js mục 7: SAVEDWG / SAVEAS *.dwg / bản vẽ tổng hợp (kích thước, hatch, chữ Việt, kiểu nét chữ/hình, khối 3D, vùng che) → DWG → mở lại.DVDCAD-DWG-kiem-tra).WIN_CSC_LINK / WIN_CSC_KEY_PASSWORD (.pfx) hoặc Azure Trusted Signing; kiểm tra chữ ký sau khi dựng. Xem HUONG-DAN-WINDOWS.md.dvd-cmd.js (thanh dòng lệnh):
INPUTSEARCHOPTIONS: khớp đầu tên, giữa chuỗi, từ đồng nghĩa (ROUND → FILLET, XOAY → ROTATE), tự sửa lỗi gõ (sửa 3 lần thì tự chạy), biến hệ thống kèm giá trị, nội dung bản vẽ (lớp, khối, mẫu hatch, kiểu chữ). Xếp lệnh hay dùng lên đầu; phần còn lại của tên hiện mờ (→ / Tab để nhận).CLIPROMPTLINES, độ trong suốt, neo ở đáy cửa sổ. Lời nhắc dài xuống dòng thay vì bị cắt.dvd-help.js) + Tìm trên ribbon (A.ribbonFind). Ctrl+F2 = cửa sổ chữ.log([...]), { nt } = giữ nguyên).dvd-acad-core.js (bộ nhập):
x,y của điểm thứ hai trở đi là tương đối (DYNPICOORDS), #x,y / *x,y tuyệt đối, x,y,z, @ = LASTPOINT; số 1/2, 3-1/2, feet-inch 5'6" (bản vẽ inch / feet).<45, bộ lọc điểm .X .Y .Z .XY .XZ .YZ, TT, FROM, M2P; gõ số theo đường truy bắt (OTRACK / TT); Tab khoá độ dài / góc / X / Y.W, C, BOX, G, U, SI, M, AU, ? (thêm vào ALL / P / L / R / A / F / WP / CP có sẵn).'CAL, 'DIST, 'ID, 'ZOOM, 'LAYER, biến hệ thống…) rồi trở lại lệnh đang dở; 'CAL trả kết quả cho lời nhắc.A.cmdMenu); Shift + chuột phải = menu bắt điểm (A.osnapMenu).dvd-acad-cmdline.js (mới): menu chuột phải, INPUTSEARCHOPTIONS, -LAYER, -INSERT, -OSNAP, UNDO (số bước, BE/E, M/B), MULTIPLE hỏi trên dòng lệnh, 17 biến hệ thống mới (A.sysvar.def).desktop/, Electron): bộ cài DVDCAD-Setup-*.exe và bản portable, chạy hoàn toàn offline. Hướng dẫn: HUONG-DAN-WINDOWS.md.
dvdcad://app/, không cần service worker hay mạng.OPEN / Ctrl+O mở hộp thoại Select File của Windows (chọn nhiều file, mỗi file một tab). Ctrl+S ghi đè đúng file đã lưu; ghi qua file tạm nên không hỏng file cũ nếu lỗi giữa chừng..github/workflows/desktop-windows.yml dựng bộ cài trên windows-latest; đẩy thẻ v* thì tạo Release.dvd-desktop.js: cầu nối trong giao diện (trên trình duyệt không làm gì).dvd-acad-start.js: tab Start là một trang riêng như AutoCAD (ẩn ribbon).
NEW nhận mẫu đơn vị (A.newDrawing({ units })).dvd-acad-pgp.js: lệnh tắt mặc định giống acad.pgp của AutoCAD.
DO = DONUT (đo nhanh nay là QM), T = MTEXT (chữ một dòng vẫn là DT).PA, REA, RA, EXP, EPDF, ADC, ATI, BC, CLI, XB, TI, VSM.index.html:
XCLIPS (mã → {bp: đa giác toạ độ khối, on, inv, cache}); xclipNew, xclipFor(R, bm) (đường cắt WCS theo ma trận chèn, dùng chung 1 đối tượng), xclipApply(list, R).xcl (mã bản ghi), xo + xh (nằm ngoài, ẩn nhưng giữ trong bản vẽ), xp + clip (cắt ngang). Vẽ, bắt điểm (isHiddenE), phạm vi, chọn, khung nhìn layout bỏ qua xh.clip('evenodd')), đa giác có lỗ kiểu AutoCAD.drawXclipFrames + XCLIPFRAME (đọc $XCLIPFRAME của DXF / DWG). Hoàn tác thao tác tự định nghĩa: {op: 'fn', undo, redo}.dvd-acad-x17.js: lệnh XCLIP (Bật / Tắt / Xoá / Tạo đa tuyến / Khung cắt mới: đa tuyến, đa giác, chữ nhật, đảo ngược), XCLIPFRAME; bọc A.commit để đường cắt đi theo khối khi dời / xoay / chép, bỏ khi phá khối.dvd-acad-core.js: isHiddenB (ẩn không tính XCLIP) cho chọn theo nhóm, gripSel bỏ phần ẩn.dvd-acad-dxf.js: khối ghi đủ thành viên + xdict → ACAD_FILTER → SPATIAL_FILTER (đỉnh WCS, ma trận nghịch đảo của INSERT). dvd-acad-cmds.js (R12): bỏ phần ẩn.v5h_test.py (25 bước, đọc lại DXF bằng ezdxf).index.html:
dwgXclipMap(db) đọc db.objects.SPATIAL_FILTER qua từ điển mở rộng của INSERT (ownerDictionaryHardId → ACAD_FILTER → SPATIAL); INSERT có xc (đa giác trong toạ độ khối)._DXF_SKIP) để lấy xdict của INSERT.xclipBlockPoly: đỉnh × ma trận nghịch đảo INSERT lúc cắt (12 số 40 đầu), 2 đỉnh = chữ nhật, mã 71 = 0 → bỏ.explodeInto → xclipRange: bỏ đối tượng nằm hẳn ngoài, gắn e.clip {x,y,w,h,poly,xc:1} cho đối tượng cắt ngang.applyClip cắt thêm c.sub (XCLIP trong khung nhìn layout); ptInClip dùng khi bấm chọn (A.pickAt).v5g_test.py (14 bước), file mẫu test/xclip_test.dxf (ezdxf: chữ nhật, tam giác, khối xoay kiểu AutoCAD, đường cắt tắt).dvd-acad-x16.js:
frz, cp) lưu ở localStorage dvd:vpx theo bản vẽ + layout + số thứ tự khung nhìn, đọc qua window.vpExtra(L, i).A.zipStore: zip không nén, CRC32), TIFOUT, BMPOUT, XOPEN, REINIT, 3DPRINT, EXPORTTOAUTOCAD, RECOVERALL, XBIND.A.mkltPattern), IMAGEFRAME, IMAGEQUALITY, SPOTLIGHT, DISTANTLIGHT, LIGHTLIST, SEPARATE (A.meshParts), AUTOCOMPLETE, DRAGMODE và các tên gọi khác.index.html: buildPaperEntities bỏ lớp đóng băng theo khung nhìn, thay khung bằng đường cắt; applyClip / drawViewportFrames cắt theo đa giác; drawImageEnt theo IMAGEFRAME / IMAGEQUALITY.dvd-acad-pro.js: xuất A.saveLayoutDef, A.proIdbGet, A.xrefList, A.refreshLayout; khung khung nhìn có vpi.dvd-acad-3d.js: đèn rọi (SpotLight), đèn song song (DirectionalLight), đèn tắt (light.off); dựng lại đèn khi bản vẽ đổi (view3D.rebuildLights).dvd-cmd.js: gợi ý lệnh theo window.DVD_AUTOCOMPLETE.v5f_test.py (45 bước kiểm tra).dvd-acad-x15.js:
e.tp (CETRANSPARENCY, TRANSPARENCY, nút TP).index.html: vẽ trong suốt (globalAlpha, không gộp nét), đọc DXF 440. dvd-acad-dxf.js: ghi 440.dvd-cmd.js:
dvd:undef, tiền tố ..v5e_test.py (29 bước kiểm tra).dvd-lisp.js: bộ thông dịch AutoLISP chạy bất đồng bộ.
defun c: thành lệnh DVDCAD.getpoint…) chạy trong ngữ cảnh lệnh tạm, Esc thì huỷ hàm.(command …) chờ từng lời nhắc qua A.reqSeq.entget / entmod / entmake dùng mã DXF; tên đối tượng bền qua _lid, khối / kích thước theo nhóm.(…) và !bien ở dòng lệnh.dvd-addins.js:
localStorage dvd:addins, Startup Suite.window.DVDCAD cho add-in .js, thẻ ribbon Add-ins.addins/: qs-khoi-luong.js, lisp-tien-ich.lsp. ADDIN-API.md: hướng dẫn viết add-in.dvd-acad-core.js: A.run(…, { quiet }), A.reqSeq. dvd-cmd.js: phím cách trong biểu thức LISP.v5d_test.py (36 bước kiểm tra).dvd-i18n.js: một công tắc ngôn ngữ chung (DVDI18N, khoá dvd:riblang, mặc định theo trình duyệt).
MutationObserver thay chữ hiển thị: nút chữ, title, placeholder, aria-label, data-tl, nút <input>, alert / confirm / prompt.=, :, · hoặc ngoặc..nm, phần tử translate="no", tên lớp / khối / layout.dvd-i18n-en.js: từ điển khoảng 4.100 mục, sinh từ chuỗi tiếng Việt trong mã bằng tools/i18n/extract.py + build.py (bản dịch gốc: tools/i18n/translations.json).dvd-acad-ui.js: ribbon dùng chung ngôn ngữ đó; menu Không gian làm việc có mục "Ngôn ngữ giao diện"; chú thích phụ tiếng Việt không còn hiện ở giao diện English.manifest.webmanifest: tên app "DVDCAD — DWG/DXF".v5c_test.py: duyệt các thẻ ribbon, bảng Thuộc tính, khoảng 20 lệnh, 25 hộp thoại, menu, khung 3D, lịch sử lệnh; yêu cầu không còn chữ tiếng Việt và chuyển qua lại được.vi-VN.dvd-acad-x14.js:
A.commit thêm các kích thước có gốc trùng điểm đặc trưng vào danh sách sửa, nên UNDO một lần trả lại cả hai.pw = [x, y, rộng đầu, rộng cuối] theo đỉnh thật, dựng lại wq sau mỗi lần commit. scaleEnt nhân độ rộng.index.html:
widePoly(): đọc LWPOLYLINE / POLYLINE có độ rộng (DXF, DWG), giữ kín + cung.polyWidthQuads thêm phần lấp góc kiểu miter; mọi mảnh tô cùng chiều vòng nên tô không bị thủng.dvd-acad-dxf.js: ghi đa tuyến rộng thành LWPOLYLINE với 40 / 41 / 42 theo đỉnh.dvd-acad-cmds.js:
A.chooseBlock.dvd-acad-3d.js: kiểu xem "Khuất nét (HIDE)"; view3D.setAzEl() và setStyle().v5b_test.py.dvd-acad-3d.js: khi đang xem 3D, khung nhìn tự dựng lại nếu có một trong các thay đổi sau:
Nếu mở bản vẽ khác, khung 3D mở lại với bản vẽ mới. Trước đây chỉ sửa hình mới dựng lại.
dvd-acad-core.js: chỉ đồng bộ trạng thái lớp từ bảng Lớp khi bảng đó thực sự đổi. Sửa được 3 lỗi:
Kiểm thử: v5a_test.py dùng bản vẽ 3D của người dùng, gồm 15 bước kiểm tra; d3.py gồm 13 bước kiểm tra. Các bài cũ so nhãn phiên bản theo thứ tự (>= v4x) nên chạy được với v5.
dvd-acad-x13.js: TJUST, TORIENT, TSCALE, TEXTFIT, TCIRCLE, MULTIPLE, HISTORY/TEXTSCR, ATTIPEDIT, XLIST, CHURLS, DELAY, DIMEX/DIMIM, MSTRETCH, VIEWBASE (3 hình chiếu, góc chiếu 1 / 3), BATTORDER, TEXTSTYLE.dvd-acad-x12.js: QTEXT, FILL, ATTDISP, RECOVER, DIMREGEN, DIMJOGLINE, DIMINSPECT, GATTE, XEDGES, VPMAX/VPMIN, MSPACE/PSPACE, PAGESETUP.dvd-acad-x11.js: REVCLOUD (cung lồi ra ngoài, cung nhỏ nhất / lớn nhất, Chữ nhật / Đa giác / Tự do / Đối tượng, Thường / Thư pháp, đảo chiều), REVCLOUDPROPERTIES, DIMOVERRIDE, BLOCKREPLACE, MOCORO, TCASE, CDORDER, HATCHGENERATEBOUNDARY, HATCHSETBOUNDARY, LAYTRANS, SHOWURLS, GETSEL, SSX, XPLODE, ARRAYCLASSIC.dvd-acad-x10.js: DIM (kích thước thông minh), MLEDIT (chữ thập / chữ T / góc cho tường MLINE), ATTSYNC + BATTMAN, MLEADEREDIT / MLEADERALIGN / MLEADERCOLLECT, TRACE, 3DSCALE, FILTER, PASTEBLOCK, LIMITS, POLAR, VISUALSTYLES, DWGCOMPARE.libredwg-web.js: chép theo sab_size từ bộ nhớ WASM) → chế độ 3D hiện đủ khối.DXFVERSION: 2018 / 2013 / 2010 / 2007 / 2004 / 2000 / Tự động / R12.dvd-acad-dxf.js: ghi DXF AC1015 đầy đủ handle / BLOCK_RECORD / OBJECTS; bề rộng nét 370, LWPOLYLINE, MTEXT, HATCH (đặc + mẫu), ELLIPSE, XLINE/RAY, kiểu nét phức, khối + thuộc tính, DIMENSION. DXFVERSION để chọn lại R12..ctb của AutoCAD, sửa màu in, bề rộng nét, độ đậm theo màu; chọn trong PLOT.dvd-icons.js, ~260 biểu tượng tự vẽ).server-dwg.js + ODA File Converter.LIGHT), CAMERA, góc nhìn đã lưu, đi bộ (3DWALK).SECTION2D).UNION, SUBTRACT, INTERSECT, SLICE.REVOLVE, SWEEP, PYRAMID, WEDGE, TORUS. Đặt cao độ bằng ELEV.3DMOVE (theo Z), 3DROTATE (trục X/Y/Z/2 điểm), MIRROR3D.MATERIALS (11 vật liệu có vân), RENDER (bóng đổ), SECTIONPLANE (mặt cắt ngang).BOX, CYLINDER, CONE, SPHERE, EXTRUDE (đa tuyến/tròn/elip/hatch có lỗ), PRESSPULL, WALL3D (dựng tường từ mặt bằng).3DORBIT, nút 3D): xoay/dời/phóng bằng chuột hoặc ngón tay, ViewCube, góc nhìn chuẩn, khung dây/tô bóng/X-quang, phối cảnh/song song.ATTDEF, EATTEDIT (kích đúp), ATTEXPORT ra CSV. Đọc được ATTRIB của file gốc.IMAGEATTACH, IMAGEADJUST.XATTACH, XREF. Nền mờ, bắt điểm được, tự nạp lại khi mở bản vẽ.LAYOUT (khổ giấy + khung tên), MVIEW (khung nhìn theo tỉ lệ), VPEDIT. PLOT in layout đúng khổ.OVERKILL, BOUNDARY, DONUT, MEASUREGEOM (đo nhanh khi rê chuột), ISOLATEOBJECTS / HIDEOBJECTS / UNISOLATEOBJECTS.QSELECT, MLEADER/QLEADER, ALIGN, LINETYPE, LTSCALE, LWEIGHT. Tooltip kiểu AutoCAD trên ribbon và khi rê chuột lên đối tượng.L, PL, C, M, TR, O…, nhập toạ độ x,y / @dx,dy / dài<góc), phím tắt, bảng Thuộc tính (Ctrl+1).dvd-config.js — 3 mã Google (Client ID, API key, Project number). Để trống = tắt phần Drive.dvd-cloud.js — Google Drive, chia sẻ, cộng tác. dvd-collab-core.js — lõi hợp nhất dữ liệu cộng tác.dvd-cmd.js — dòng lệnh, phím tắt, bảng Thuộc tính.dvd-acad-core.js (bắt điểm, chọn, grip, lớp), dvd-acad-cmds.js (các lệnh vẽ/sửa/kích thước/hatch/khối), dvd-acad-ui.js (ribbon, thanh trạng thái, hộp thoại), dvd-acad-more.js (QSELECT, MLEADER, ALIGN, kiểu nét, PLOT, tooltip), dvd-acad-ext.js (tab nhiều bản vẽ, sửa khối, bảng, QDIM), dvd-acad-pro.js (thuộc tính khối, ảnh nền, XREF, layout giấy) — phần AutoCAD v4.index.html — toàn bộ ứng dụng (parser DXF + bộ vẽ + đo + ghi chú).libredwg-web.js, libredwg-web.wasm — bộ giải mã DWG (LibreDWG, giấy phép GPL-3.0, ~15MB tổng).manifest.webmanifest, sw.js, icon-*.png, apple-touch-icon-180.png — phần PWA (cài đặt + offline).⚠️ App phải được chạy qua HTTPS (hoặc localhost) thì service worker mới hoạt động. Mở thẳng file
index.htmlbằngfile://sẽ KHÔNG cài/offline được. Hãy đưa lên một host (hướng dẫn dưới).
DVDCAD), để Public.main, thư mục / (root). Lưu.https://dangdvd.github.io/DVDCAD/. Mở địa chỉ này bằng Safari trên iPhone.Vì app chạy trong thư mục con (
/DVDCAD/), mọi đường dẫn đã để tương đối (./…) nên hoạt động đúng.
Bấm Mở file trong app → chọn .dxf hoặc .dwg từ ứng dụng Files/iCloud Drive.
File được đọc ngay trên máy, không tải lên máy chủ nào.
*D… nên có đủ đường gióng,
mũi tên và chữ số đo. Layer Defpoints (điểm dựng hình) được bỏ qua.Nếu bạn sửa file rồi upload lại mà máy vẫn hiện bản cũ: mở sw.js, đổi const CACHE = 'dvdcad-v1'
thành 'dvdcad-v2' (tăng số), upload lại. Service worker sẽ xoá cache cũ và nạp bản mới.
DVDCAD là phần mềm mã nguồn mở theo giấy phép GNU GPL phiên bản 3 hoặc mới hơn (xem LICENSE).
libredwg-web.js, libredwg-web.wasm) theo GPL-3.0, nên bản đóng gói (web và Windows) cũng phải theo GPL-3.0.
Nguồn: https://github.com/mlightcad/libredwg-web và https://github.com/LibreDWG/libredwgvendor/.A.commitA.runA.logdvd:plotlogtoast: nhận "Đã lưu …dwg/dxf" là sự kiện lưu → AUTOPUBLISH (A.plotPDF) + chụp phiên bản; TRAYSETTINGS đổi thời gian / tắt thông báo.dvdcad-x33/hist, khoá h:<tên>:<thời điểm>, tối đa 30.
entSig đếm theo bội số, đánh dấu bằng bản sao trên lớp DIFF$….XREFCOMPARE dùng A.parseRef / A.placeRef (mở từ dvd-acad-pro.js). ADCNAVIGATE dùng A.dcOpen (dvd-acad-x8.js).SMARTBLOCKSREPLACE: độ giống = 0.75 × Jaccard số đối tượng theo loại + 0.25 × độ khớp tỉ lệ khung.webkitdirectory.zipA.unzipdlg3installSet.lsp.fas/.vlx/.dll/.arx.lspcodeOfSUPPORTFILESA.PLOT_DEVICESPS.tp, PS.ps, PS.slw, PS.toFile, PS.cw / PS.ch. Áp cho layout lưu ở dvd:lplot::<bản vẽ>::<layout>.setProperty(…, 'important')resize()A.switchTab(); vòng kiểm 250 ms xếp lại khi đổi bản vẽ hoặc số tab. Nút □ hoặc gõ lại lệnh = một cửa sổ.dvd-acad-x4.jssmooth với khoá s0 / s1 (đầu spline = e.spl).endInfo() cho điểm, tiếp tuyến đi ra và độ cong có dấu ở đầu đường kia.smoothSpl() đặt P0, đặt P1 theo tiếp tuyến, rồi dời P2 vuông góc. Độ cong đầu của Catmull-Rom là κ = −4·((P2−P0)·n)/L².translate() dời cả e.spl.A.alignSpace(L, i, m1, p1, m2, p2) đổi vh / dcx / dcy của khung nhìn; với layout DVDCAD thì lưu vào D.vps[i].n / cx / cy.loadDXF / loadDWG, rồi lát các ô trên vùng vẽ. Ribbon: A.ribbonAct('SYSWINDOWS|V')…libredwg-web.js readPlotSettingsAt(base) đọc struct PLOTSETTINGS thẳng từ HEAPU8, vì dynapi của bản wasm không trả struct con.LAYOUT + 12 tên, +16 máy in, +20 khổ giấy, +24 cờ, +72 / +80 khổ mm, +136…140 đơn vị / xoay / kiểu in, +144 / +152 tỉ lệ, +160 bảng kiểu in, +164 / +168 tỉ lệ chuẩn. Đã đối chiếu DWG 2000 / 2004 / 2018 của AutoCAD với DXF cùng bản vẽ.unreadable.layout.plot và window._dwgPageSetups, rồi A.setupsFromDWGFrame(w) → psFrom() (dùng chung với DXF; DXF đọc thêm mã 44 / 45).A.geoToLLA.geoFromLLdvd-acad-dlg4.jsp3 (đỉnh có z).
POLYLINE_3D (16) / VERTEX_3D (11) + SEQEND trong dvd-dwg.js.libredwg-web.js thêm đỉnh cuối qua last_vertex. LibreDWG bỏ sót đỉnh này khi đọc R13–R2000.e.ie của 3DFACE (DXF mã 70). Chọn 3DFACE trong core theo đúng thứ tự đỉnh.parseSHP, parseSHX. Ghi: compileSHX. Trình thông dịch mã hình 0–14 với vectơ 16 hướng.shpx, dựng lại khi LOAD (applyPending).dvd:shx:<TÊN>.dvd-acad-x21.js:
A.epsOut: điểm = mm × 72 / 25,4.A.wmfOut(list, opt): header placeable 0x9AC6CDD7, 254 đơn vị / inch.A.publishWeb(...).A.dwgConvertFiles(files, tgt, onEach, onLoaded):
?dwgconvert=1, đọc bằng đúng bộ đọc của app, rồi ghi bằng A.dwgNative / DXF.PARTIALOAD và PSETUPIN (với tệp DWG) cũng dùng iframe này.dvd-acad-dlg4.js tách vòng vẽ vectơ của máy vẽ HPGL thành A.vecWalk / A.vecRgb (HPGL ra giống hệt từng byte).dvd-acad-x22.js: CLOSEALLOTHER, ATTREDEF, PSETUPIN (A.setupsFromDXF đọc đối tượng PLOTSETTINGS), PARTIALOPEN / PARTIALOAD, SYSVARMONITOR (dvd:svmon), QUICKPROPERTIES (QPMODE), MVSETUP, PLOTTERMANAGER, UPDATETHUMBSNOW.dvd-acad-more.js: A.pageSetups() / A.pageSetupApply(); hộp PLOT có #plSetup.psu). Khi mở bản vẽ, các thiết lập này được chép vào dvd:psetups::<tên>.dvd-acad-x5.js): BVSTATE / BVSHOW / BVHIDE. Thêm REFSET vào dvd-acad-ext.js.DWGSERVER (bản Windows): nút Tải ODA File Converter gọi dvdDesktop.openExternal (chỉ http/https) tới trang tải chính thức của ODA — ODA không đóng gói kèm bộ cài; nút Tìm lại và sự kiện focus của cửa sổ gọi lại dvdDesktop.odaInfo() (findODA() trong desktop/main.js) để hiện đường dẫn vừa cài.GEOMAPIMAGEGEOMAPIMAGEUPDATEA.plotQuantize(R, mask)A.pngIndexed(q, dpi)A.plotterProps(dev)dvd-acad-more.js plotRender: giảm màu thì vẽ lên nền trong suốt (window.__plotClear) để biết độ phủ từng điểm ảnh; lượt vẽ mặt nạ khi bảng .ctb có màu tắt dither.window._plotCJcwindow._plotDiamondclip + cpoly (DXF ghi khung đã cắt), khối 3D → A.solidPlan(e) (cạnh lưới / biên dạng / đường tròn) rồi cắt như nét.dvd:cui = { cmds, qat, keys, dbl, tabs, partial }; A.cuiApply() đăng ký lệnh macro (A.runMacro), dựng thanh truy cập nhanh, tab ribbon cui_* (qua A.ribbon.RIB / WS), phím tắt và nhấp đúp (A.onDblEnt).dvd-help.js (mới): cách dùng của ~60 lệnh thông dụng + lời nhắc đầu của mọi lệnh (tools/help/prompts.js sinh tự động).-BLOCK.desktop/test/smoke.js (nhập động, khoá góc + 'CAL, bộ lọc .X, script -LAYER + UNDO BE/E, gợi ý đồng nghĩa / sửa lỗi gõ / biến hệ thống, trợ giúp).LICENSE: GPL-3.0 (mã nguồn mở, bắt buộc vì có LibreDWG).index.html vẫn nạp nhưng chưa từng có trong repo, nên các lệnh dưới đây không chạy):
dvd-acad-x3.js:
DRAWORDER / DR (F B A U), TEXTTOFRONT, HATCHTOBACK.WIPEOUT / WO (điểm, D đa tuyến, F khung).CANNOSCALE (ô ▲ 1:N ở thanh trạng thái), ANNOTATIVE.SAVEDWG / DWGOUT, DWGSERVER. Bản Windows chuyển bằng ODA File Converter trên máy (từ v5k: mặc định tự ghi DWG 2000).dvd-acad-x4.js: ràng buộc tham số.
GEOMCONSTRAINT, DIMCONSTRAINT, AUTOCONSTRAIN, PARAMETERS, DELCONSTRAINT, CONSTRAINTBAR.A.commit, nên mọi cách sửa đều giữ ràng buộc, U hoàn tác cả nhóm.d1*2, sqrt(d1^2+d2^2)). Ràng buộc lưu kèm DXF.dvd-acad-x5.js: khối động.
BPARAMETER: V hiển thị, L kéo giãn, F lật, X bỏ.BDYN hoặc mục "Khối động" trong bảng Thuộc tính. Bản chèn mới tự nhận định nghĩa.desktop/test/installed.js chạy trên windows-latest (cài lặng → kiểm tra file / gắn .dwg .dxf / lối tắt → chạy smoke.js trên DVDCAD.exe đã cài → gỡ cài).v* (vd v5.9.0), hoặc Actions → DVDCAD Windows → Run workflow trên main với release_tag = v5.9.0; ghi chú lấy từ desktop/RELEASE-NOTES.md.sw.js: nạp từng file riêng. Trước đây thiếu một file (404) làm hỏng cả bộ nhớ offline.desktop/test/smoke.js (29 bước). Gồm: mở DWG từ dòng lệnh, OPEN / SAVEAS / QSAVE qua hộp thoại, lưu lỗi, trang Start, lần chạy thứ 2, an toàn file / link, lệnh phục hồi + SAVEDWG, lệnh tắt acad.pgp.