Skip to content

Community poll: what should I build next in dxf-render / dxf-vuer?Β #8

Closed

Description

@arbaev

πŸ—³οΈ Community poll: what should we build next in dxf-render / dxf-vuer / dxf-react / dxf-lit?

Hey everyone! The dxf-render engine and its framework wrappers β€” dxf-vuer (Vue 3), dxf-react (React 18+) and dxf-lit (a <dxf-viewer> Web Component usable from Angular / Svelte / vanilla) β€” share one long roadmap, and I'd love to hear from you which features matter most for your use cases.

Most features land in the shared engine (and the dxf-interaction layer) and ship across all three wrappers at once, so your vote counts no matter which one you use.

  1. Leave a comment with your top 3 features (just paste the IDs, e.g. R-1, I-1, UI-3).
  2. Briefly describe your use case β€” it helps us prioritize features that solve real problems.

Viewing only for now β€” DXF editing is explicitly out of scope.


🎨 Rendering β€” more DXF coverage

New entity types

  • R-1 Β· IMAGE / WIPEOUT β€” raster images embedded in DXF (parser ready, needs render)
  • R-2 Β· 3DSOLID β€” ACIS solids (at least wireframe / bounding box)
  • R-3 Β· VIEWPORT β€” render model-space content inside paper-space viewports
  • R-4 Β· TABLE (ACAD_TABLE) β€” tables with cells and styles
  • R-5 Β· TOLERANCE β€” GD&T feature control frames
    βœ”οΈ R-6 Β· REGION β€” 2D regions, rendered by borrowing the bounding HATCH's boundary edges (done in dxf-render 1.6.0)

Existing entity improvements

  • R-7 Β· SHX fonts β€” AutoCAD SHX support (conversion or custom parser)
  • R-8 Β· Vertical text β€” TEXT/MTEXT with vertical flow direction
  • R-9 Β· Bidirectional text β€” correct RTL ordering (Arabic, Hebrew)
  • R-10 Β· Full DIMSTYLE coverage β€” all DIMSTYLE variables
  • R-11 Β· Full MLINESTYLE β€” fills, end caps, joints
  • R-12 Β· Gradient HATCH β€” gradient fills (currently solid + patterns only)
  • R-19 Β· CJK / Unicode font fallback β€” fallback chain (e.g. Noto Sans SC/JP/KR) in glyph triangulation; today unknown glyphs render as ?
  • R-20 Β· Draw order (SORTENTSTABLE) β€” honor source order / SORTENTSTABLE so thick polyline / SOLID meshes can sit above thin lines
  • R-21 Β· MTEXT \T and \A inline codes β€” character tracking (\T<n>;) and baseline shift (\A<n>;) for inline sub/superscript; parser currently swallows them with no visual effect

Paper Space / Layouts

  • R-13 Β· Layout switching β€” toggle between Model Space and Paper Space
  • R-14 Β· Title blocks & sheets β€” borders, title blocks, sheet scales
  • R-15 Β· Layout selector prop/component

DWG support

  • R-16 Β· DWG parsing β€” DWG β†’ DXF via WASM lib (LibreDWG / ODA File Converter) or a native binary parser
  • R-17 Β· Format auto-detection β€” detect DWG/DXF by file signature and handle transparently
  • R-18 Β· DWG version coverage β€” R14 / 2000 / 2004 / 2007 / 2010 / 2013 / 2018

⚑ Performance & scalability

  • P-1 Β· Streaming parser β€” incremental parsing for large DXFs (>50 MB)
  • P-2 Β· Level of Detail (LOD) β€” geometry simplification at low zoom
  • P-3 Β· Frustum culling β€” skip off-screen objects
  • P-4 Β· GPU instancing β€” InstancedMesh for mass INSERT blocks
  • P-5 Β· Lazy block loading β€” defer rendering blocks outside viewport
  • P-6 Β· Memory optimization β€” BufferGeometry reuse, proper dispose on file switch
  • P-7 Β· Progressive rendering β€” show partial scene during load

🧭 Navigation & interaction

Camera

  • N-1 Β· Minimap β€” overview navigator in the corner
  • N-2 Β· Named views navigation β€” jump to VPORT / Named Views from DXF
    βœ”οΈ N-3 Β· Zoom to selection β€” viewer.zoomToEntity(handles[]) (done in dxf-vuer 2.5.0)
    βœ”οΈ N-4 Β· Zoom to layer extents β€” viewer.zoomToLayer(layerName) + getZoomBoxForLayer() (done in dxf-vuer 2.6.0)
  • N-5 Β· Navigation history β€” undo/redo camera positions
  • N-6 Β· Animated transitions β€” smooth camera tweens on fit/zoom

Measurements & info

βœ”οΈ I-1 Β· Distance measurement tool β€” ruler between two points (done in dxf-vuer 3.0.0)
βœ”οΈ I-2 Β· Area measurement β€” closed region (done in dxf-vuer 3.0.0)
βœ”οΈ I-3 Β· Angle measurement (done in dxf-vuer 3.0.0)
βœ”οΈ I-4 Β· Snap to geometry β€” vertices, midpoints, centers (done in dxf-vuer 3.0.0)
βœ”οΈ I-5 Β· Entity inspector β€” entity-click event with { handle, type, layer, text?, entity?, association? } (done in dxf-vuer 2.5.0)
βœ”οΈ I-6 Β· Attribute search β€” findEntitiesByText(dxf, query) across TEXT/MTEXT/ATTRIB/ATTDEF/DIMENSION/MULTILEADER (done in dxf-render 1.4.0)
βœ”οΈ I-7 Β· Search by layer / type β€” findEntitiesByLayer(dxf, layerName) and findEntitiesByType(dxf, type | type[]) return handles, symmetric with findEntitiesByText (done in dxf-render 1.5.0)

Selection

βœ”οΈ S-1 Β· Click to select β€” pickingEnabled prop, entity-click event, built-in highlight overlay (done in dxf-vuer 2.5.0)

βœ”οΈ S-2 Β· Rectangle selection β€” marquee select (done in dxf-vuer 3.0.0)
βœ”οΈ S-3 Β· Layer hover highlight β€” emphasize all entities on layer hover (done in dxf-vuer 3.0.0)

  • S-4 Β· Spatial association heuristic β€” heuristic association of leader/dimension to the nearest geometry pointed to by the arrow (optional flag, experimental β€” DXF does not store this association)
    βœ”οΈ S-5 Β· Precise selection highlight β€” highlight by real entity geometry instead of the entity's bounding box (done in dxf-vuer 3.0.0)
    βœ”οΈ S-6 Β· ACAD_GROUP associations β€” emit group associations from the ACAD_GROUP dictionary (requires OBJECTS-section parsing) (done in dxf-render 1.7.0)

Bonus shipped in dxf-render 1.4.0 / dxf-vuer 2.5.0 (not originally in the poll): Semantic associations β€” buildAssociations(dxf) derives MULTILEADER, LEADER↔TEXT (DXF 340), INSERT+ATTRIB and DIMENSION groups strictly from DXF data; events and the built-in highlight automatically expand to all members.

Bonus shipped in dxf-render 1.6.0 (not originally in the poll): Standard arrowhead blocks β€” all 18 standard AutoCAD arrowhead names (closed-filled, open, datum, dots, ticks, boxes, origin, integral, none) honoured at DIMENSION endpoints and LEADER tips via DIMSTYLE codes 342/341 and $DIMBLK. MTEXT scoped formatting β€” inline { … } push/pop format scope plus \W<n>; / \Q<n>; width/oblique runs. DIMSTYLE accuracy β€” DIMCLRD/DIMCLRE/DIMCLRT, DIMTIH/DIMTOH, DIMDEC/$DIMADEC, architectural fractions, radial state machine, outside-arrow flip for short dim lines. STYLE.widthFactor, correct binary-DXF rejection, layer flag bit 2.


πŸ–ΌοΈ UI & UX

Panels

βœ”οΈ UI-1 Β· Properties panel β€” details of the selected entity (done in dxf-vuer 3.0.0)

  • UI-2 Β· Blocks panel β€” list all INSERT blocks with navigation
  • UI-3 Β· Text/dim style panel β€” overview of styles in use
  • UI-4 Β· Extended statistics β€” charts of entity/layer distribution
  • UI-5 Β· Breadcrumbs β€” Layout > Block > Entity path
  • UI-6 Β· Context menu β€” right-click β†’ Zoom to / Properties / Copy coords
    βœ”οΈ UI-7 Β· Rulers β€” horizontal & vertical rulers around the canvas with adaptive tick scale, pan/zoom-synced ticks, optional showRulers / rulerUnits props and a cursor marker (done in dxf-vuer 3.0.0)

Layer panel

βœ”οΈ L-1 Β· Layer search filter β€” text filter by layer name (done in dxf-vuer 2.4.0)

βœ”οΈ L-2 Β· Layer grouping β€” auto-group by prefix (A-WALL, A-DOOR β†’ group A) (done in dxf-vuer 3.0.0)

  • L-3 Β· Drag-and-drop layer order
    βœ”οΈ L-4 Β· Persist visibility β€” remember layer state across sessions (localStorage) (done in dxf-vuer 2.6.0)
  • L-5 Β· Visibility presets β€” quick configs ("architecture only", "electrical only")

Toolbar

  • T-1 Β· Button groups β€” visual separators between groups

Styling

βœ”οΈ UI-8 Β· Stable class hooks β€” single-class, low-specificity selectors (e.g. .dxf-viewer-toolbar) documented as public CSS hooks so user CSS / Tailwind @apply reliably wins over defaults (done in dxf-vuer 3.0.0)
βœ”οΈ UI-9 Β· classes prop (Headless UI-style) β€” a map of class overrides per named element: { toolbar, layerPanel, loadingSpinner, errorOverlay, … }; covers Tailwind / utility-CSS users without going full headless (done in dxf-vuer 3.0.0)


πŸ“€ Export & integration

Export

  • E-1 Β· SVG export β€” vector export of visible layers
  • E-2 Β· PDF export β€” preserving scale and layers
  • E-3 Β· PNG export options β€” resolution, DPI, transparent background
  • E-4 Β· Copy to clipboard β€” screenshot current view

Print

  • E-5 Β· Print layout β€” print prep with border and scale
  • E-6 Β· Print-friendly CSS β€” @media print styles

Loading

βœ”οΈ E-7 Β· Load from ArrayBuffer / Blob β€” file-storage integration (done in dxf-vuer 2.4.0)

  • E-8 Β· Authenticated URL loading β€” custom headers on URL fetch
  • E-9 Β· .dxf.gz support β€” auto gzip decompression

β™Ώ Accessibility

βœ”οΈ A-1 Β· ARIA attributes β€” aria-label on all controls (done in dxf-vuer 2.6.0)

  • A-2 Β· Keyboard navigation β€” Tab/Enter/Space across UI
    βœ”οΈ A-3 Β· Keyboard pan/zoom β€” arrows to pan, +/- to zoom (done in dxf-vuer 2.6.0)

  • A-4 Β· Screen reader announcements β€” loading, errors, layer changes

  • A-5 Β· Focus management β€” visible focus, correct tab order
    βœ”οΈ A-6 Β· prefers-reduced-motion β€” disable TAA and transitions (done in dxf-vuer 2.4.0)

  • A-7 Β· High contrast mode β€” Windows High Contrast support


🧩 API & extensibility

DXFViewer

βœ”οΈ API-1 Β· v-model for layer visibility β€” two-way binding (done in dxf-vuer 3.0.0)
βœ”οΈ API-2 Β· Events: entity-click / entity-hover β€” with entity data and association (done in dxf-vuer 2.5.0)
βœ”οΈ API-3 Β· Programmatic API β€” viewer.zoomToEntity(handles[]), viewer.highlight(handles[]), viewer.clearHighlight(), viewer.getAssociations(), viewer.findAssociationsByHandle(), viewer.getPickingIndex() (done in dxf-vuer 2.5.0)

  • API-4 Β· Plugin system β€” register custom entity renderers

Other

  • API-5 Β· Headless mode β€” server-side rendering (Node + headless GL) for thumbnails
    βœ”οΈ API-6 Β· React wrapper β€” dxf-react on top of dxf-render (done in dxf-react 0.1.0)
    βœ”οΈ API-7 Β· Web Component on Lit β€” <dxf-viewer> custom element built with Lit; one package usable from React/Angular/Svelte/vanilla via native DOM (props as attributes, events as CustomEvent, slots like Vue) (done in dxf-lit 0.1.0)

βœ… Quality

  • Q-1 Β· Visual snapshot tests β€” reference DXF vs. rendered image diff
  • Q-2 Β· Parser fuzz testing β€” resilience to malformed DXF
  • Q-3 Β· Performance benchmarks β€” 1 MB / 10 MB / 50 MB files
  • Q-4 Β· E2E tests β€” Playwright for core scenarios
  • Q-5 Β· Storybook / Histoire β€” interactive component catalog
  • Q-6 Β· API Reference β€” auto-generated from TSDoc
  • Q-7 Β· Reference DXF suite β€” compatibility across AutoCAD / BricsCAD / LibreCAD / QCAD
  • Q-8 Β· Migration guide β€” upgrade documentation between major versions
  • Q-9 Β· Integration examples β€” Nuxt, Vite, webpack, CDN starter recipes
  • Q-10 Β· Compatibility report β€” automated render diff against an AutoCAD reference set

πŸ’‘ Missing something?

If your must-have isn't listed, just comment below!

Thanks for helping shape the roadmap!

Activity

  1. added
    help wantedExtra attention is needed
    questionFurther information is requested
    on Apr 22, 2026
  2. snakefood3232 commented on Apr 22, 2026

    @snakefood3232

    I’m working with large-format CAD exports that often exceed 50MB, so P-1 (streaming parser) would unblock our pipeline on DXFs that currently time out or crash. I’d implement an incremental SAX-style tokenizer that yields entities as chunks arrive, keeping the existing API surface intact. Can have a PR up within 48 hours. I’ve built streaming parsers for SVG and STEP files in the past, so the pattern is familiar.

  3. arbaev commented on Apr 22, 2026

    @arbaev
    OwnerAuthor

    Hi @snakefood3232! Thanks a ton for jumping in β€” SVG/STEP streaming experience is exactly the right background for this.
    A few things before you cut a PR, so we're aligned:

    1. Sample file, please. Could you share a drawing that currently times out or crashes? Even trimmed-down, a real 50 MB+ file would be gold β€” I'd reproduce locally and add it to the benchmark suite (P-3 on the roadmap). Synthetic is fine too.
    2. Keep the public API intact. Entry points are parseDxf(text): DxfData and parseDxfAsync(text): Promise. I'd rather route internally (small files β†’ current path, large files β†’ your streaming tokenizer, both resolving to the same DxfData) than add a new public signature. Existing consumers get the speedup for free.
      One caveat: parseDxfAsync takes a string today, so the whole file is already in memory before we start. True streaming wants ReadableStream or similar β€” worth thinking about whether the input type should grow. Curious how you'd approach it.
      Progressive consumption (onEntity callback, async iterable) is interesting but out of scope for v1 β€” let's prove the streaming path works behind the existing API first.
    3. Scope check. The parser has ~25 entity handlers, cross-referenced sections (HEADER/TABLES/BLOCKS/ENTITIES), and 854 tests in packages/dxf-render/src/parser/tests.
      Tokenizing is maybe 20% of the work β€” the rest is not breaking existing behavior. If you want to land this incrementally (streaming scanner first, then section-by-section), that's very welcome and much easier to review than one big PR.
    4. What's the actual symptom β€” timeout or crash? They point to different fixes:
    • Crash β†’ OOM, streaming parser is the right call.
    • Timeout β†’ slow time-to-first-frame, which is more about progressive rendering (P-7) than parsing. A streaming parser won't help much if we still wait for full DxfData before rendering.

    Want to make sure we're fixing the thing you're actually hitting.
    No rush on 48h β€” quality > speed. Looking forward to the sample!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is neededquestionFurther information is requested

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions