DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure
DXF Viewer with Measure DXF Viewer with Measure
DXF Viewer with Measure
Go Back  Xtreme Visual Basic Talk > > > DXF Viewer with Measure


Reply
 
Thread Tools Display Modes
  #41  
Old 02-12-2012, 04:32 PM
surfR2911 surfR2911 is offline
Contributor
 
Join Date: Oct 2009
Posts: 719
Default more explorations..


The cursor stuff in my previous post was trying to see if I could detect what size cursor Windows was using (normal, large or extra large), so if the DXF Viewer had, for instance, not one, but two sets of cursors (Normal and extra large), it could switch between them based on what the user had specified under the Windows O/S control panel.

I didn't know that AutoCad used the term "graphical objects" - it was just something I made up. I also did not know that lines could be non-fixed in DXF files.

The new "wrapper" interface for the DXFViewer custom control uses an Outlook style sidebar with a flyout similar to the way the toolbox flyout in VisualStudio.Net.

The article on how to do it is here.
But the sample for that article doesn't go into multiple custom nested sections, so I'm having to do a lot of work to modify the sample.
(screenshot of flyout sample so far is attached - the white box on the bottom is the treeview control that will be populated with a hierarchical text display of the internal file entities/blocks, including characteristics like x,y values and colors). The reason the treeview is needed is because if you have a funky dxf file that isn't displaying anything you want to be able to look at the data being loaded for corrupting entries.

Speaking of funky dxf files, I 'm also attaching a new set of dxf testing samples that aren't working as well as screenshots of the errors.

Some dxf files appear to load successfully, but nothing is seen on the screen. (see the screenshot in the next post).

If you load a the sample.dxf that works after one of these "showing nothing" dxfs (like Group1.dxf) then the other strange thing that happens is the chkListLayers control ends up having two sets of checkboxes instead of clearing out the checkboxes for the first file and only presenting the checkboxes for the second file.

Then there are dxf files which just generate unhandled errors.
This is the most cortical of the three types of conditions because it has the possibility of crashing any VB.Net app that uses the dxf viewer user control.
One of the errors appears to be caused by color mapping - that the DXF file can't "re-palette-ize" colors that are not AutoCad supported into an "AutoCAD safe" color palette (it would be nice if it could pick the closest AutoCad safe color --without having to write too much extra re-mapping code, maybe?)

I'll also through in a screenshot of what the Gruff sample.dxf file looks like when turned on it's side in a simple 3D CAD program - Amapi3D.
Note: CorelDraw will load the sample.dxf file but only show parts of it - I don't know why?

Last edited by surfR2911; 02-12-2012 at 04:43 PM.
Reply With Quote
  #42  
Old 02-12-2012, 04:34 PM
surfR2911 surfR2911 is offline
Contributor
 
Join Date: Oct 2009
Posts: 719
Default More dxf files loaded screenshots

These are some extra screenies showing the dxf files in sample pack #2 do work - just not in the DXF Viewer..
Reply With Quote
  #43  
Old 02-12-2012, 10:33 PM
Gruff's Avatar
GruffDXF Viewer with Measure Gruff is offline
Bald Mountain Survivor

Retired Moderator
* Expert *
 
Join Date: Aug 2003
Location: Oregon, USA - deceased
Posts: 6,440
Default

The viewer control as written gathers attributes from entities until it detects a new entity or end of the entity section. At that point if creates an entity for the oList.

when it encounters a layername that does not exist in the layername list it adds the layer to the list. It has no way of knowing whether an entity was created for a layer. The simplest solution would be check the oList.Count and if it is zero clear all layer structures. In any case all layer structures should be cleared before import including the selectedLayerList. Its possible I missed that.
---
The viewer control as written makes the assumption it is being fed 2D wireframe geometry or 3D wireframe geometry where all entities were created in a 2D plane (All z values are the same) and z is the axis for all arcs and circles. Feeding it anything else will of course cause unexpected results. If you intend to support true 3D wireframe then you are looking at a complete rewrite of every class
---
Some CAD system can produce bad or poorly defined entities such as zero length lines or geometry outside the scale range. The viewer makes no checks for these.
---
P.S. We haven't discussed other Acad geometry types yet such as Polylines, Splines, and ellipses.
__________________
Burn the land and boil the sea
You can't take the sky from me


~T

Last edited by Gruff; 02-13-2012 at 02:10 PM.
Reply With Quote
  #44  
Old 02-14-2012, 12:44 PM
surfR2911 surfR2911 is offline
Contributor
 
Join Date: Oct 2009
Posts: 719
Default oLists clearing and viewer support

Quote:
The simplest solution would be check the oList.Count and if it is zero clear all layer structures. In any case all layer structures should be cleared before import including the selectedLayerList. Its possible I missed that.
Your suggestion about clearing the layers structures seems a good one.
Quote:
The viewer control as written makes the assumption it is being fed 2D wireframe geometry or 3D wireframe geometry where all entities were created in a 2D plane (All z values are the same) and z is the axis for all arcs and circles.
Is reserving the z axis this way an AutoDesk thing or a something that may vary in DXF files created from other sources?
Quote:
If you intend to support true 3D wireframe then you are looking at a complete rewrite of every class.
Definitely not - lets no go there.
Getting robust 2D support is going to be daunting enough.

The only reason I attached that side view image is that is how I think of layers - stacked on top of one another but viewed from the side as floating with interweaving/interleaving space between the layers.
Just sticking with 2D it's still possible to represent the layers not from the top view, but in the way Photoshop represents layers with groups in its Layers Panel.

In such a way I'm thinking entity-objects could (eventually) appear as a sub-hierarchy item(s) underneath a layer in a layers panel - using the eye icon instead of checkbox controls to turn off layers (and show, or not show, entities connected with that layer).

Of course getting the entities represented as text in a treeview hierarchy is the intermediate step before thinking about having the layers/entities represented graphically in a layers panel.

I'm still trying to figure out the perfect/right/ideal way to shovel all the entity and oList data into a some type of array (string?) that can be efficiently fed to the treeview control (without too much looping along the way).
Quote:
Some CAD system can produce bad or poorly defined entities such as zero length lines or geometry outside the scale range. The viewer makes no checks for these.
Yes, back to more coding to build in more robustness.
I wonder if I'm going to have build a full blown DXFFileAnalyzer function that's thousands of lines of code long (with way too many try..catches along the way).
Quote:
P.S. We haven't discussed other Acad geometry types yet such as Polylines, Splines, and ellipses.
Yes, because I haven't found any really good dxf files that demo these.

I think one of the samples I've posted so far has an ellipse.
There is also one that has a little hatching. I haven't gotten too deep into what "brush types" AutoDesk's dxf spec might support (or be able to emulate), and I don't know whether the hatching in the sample is "fake hatching" (i.e. just using a collection of lines to simulate a hatch brush fill).
Here's a quick video YouTube link about doing fills for dxf files - but it doesn't tell me much about how many types of fills dxf files are supposed to support.

I've read a little bit about the splines in the DXF Specs --so a sample dxf file that has a set of these 3 features might be helpful.

If you can't come up with one I might be able to find a dwg with these 3 types and convert it to a dxf now that I finally loaded AutoCad 2002 on to my coding computer.
Note: In AutoCad 2002 when exporting dxf files the two primary options are:
1.) AutoCad 2000 dxf
2.) AutoCad R14 dxf
Which do you think is closest to the type dxf file that the DXF Viewer is designed to handle (with it's minimal error checking maybe the older version might be better)?

Do you have any more ideas along the lines of the "oBlockList" mentioned back in post#36 of this thread?

Last edited by surfR2911; 02-14-2012 at 01:25 PM.
Reply With Quote
  #45  
Old 02-14-2012, 06:27 PM
Gruff's Avatar
GruffDXF Viewer with Measure Gruff is offline
Bald Mountain Survivor

Retired Moderator
* Expert *
 
Join Date: Aug 2003
Location: Oregon, USA - deceased
Posts: 6,440
Default

Quote:
Is reserving the z axis this way an AutoDesk thing or a something that may vary in DXF files created from other sources?
Definitely the latter.
The viewer currently ignores the z value.
Quote:
... side as floating with interweaving/interleaving space between the layers.
There is no heirarchy or grouping of DXF layers or physical z spacing between them. As defined they are just a sequential list.
When selected think of them as saying. Show me all entities that have these layer properties.
Cad users may or may not set them up with some sort of system relevant to their business.
That said, How you go about letting a user select visible layers can be whatever you like.
Quote:
a full blown DXFFileAnalyzer function that's thousands of lines of code long
Better thee than me.
Quote:
Note: In AutoCad 2002 when exporting dxf files
Not unlike Microsoft products most users (The smarter ones) send DXF as the earliest version they can export.
This tends to ensure the recipient can open it as they may not have a version as up to date as yours.

PLines are to the best of my knowledge are Lines and arc connected end to end as though they were one entity.
Ellipsis are single entities as well as Splines. I'll see what I can find to post.
Both PLines and Splines may be a closed loop or open ended.

RE: oBlocks appended at the end of the list.
You could either include an list offset and entity count in the new Insert Block Entity class.
but I think that would be harder to fill than a separate lookup table.

The way I envision it.
Read all entites including Insert Block entities into the oList adding unique blocknames to a table.
Record the total length of Entities so when readling the list we do not overshoot the end.
Next Read All blocks from the blocks section.
Add them one at a time adding their starting offset and length to the table.
That puts all the data in place.

the table could be a Dictionary object where quick lookups are built in.

I think Winforms supports fills. I wouldn't want to try hatches though as you would have to create a bounded graphic from the entities to contain it.

Other than rare cases I think a dxf that did not support hatching wouldn't be to a show stopper. Hatches are simply ways to clarify components from each other in say something like a section taken through an assembly.

Attached is an Acad ver 2000 dxf that contains
1 Point
1 Line
1 Arc
1 Circle
1 Ellipse
1 Line based Polyline
1 Line and Arc based Polyline
1 Line based Poly that is a rectangle.
1 Single line of text
Attached Files
File Type: zip Base Entities Minus Spline.zip (25.9 KB, 15 views)
__________________
Burn the land and boil the sea
You can't take the sky from me


~T

Last edited by Gruff; 02-14-2012 at 06:51 PM.
Reply With Quote
  #46  
Old 02-15-2012, 01:11 AM
surfR2911 surfR2911 is offline
Contributor
 
Join Date: Oct 2009
Posts: 719
Default Results of opening the file attached to previous post..

AutoCad 2002 dialog boxes after trying to open dxf file,
"Base Entities Minus Spline.dxf"

First Dialog Box: "Select Shape File"
File name: genltshp.shx (autofilled)
Files of type: Shape Fonts (*.shx)

I press "Cancel" and then..

Second dialog box
"Proxy Information" contained the following text:
Quote:
The last command created proxy entities to represent original objects and entities whose parent ARX application(s) are currently not loaded.

These proxy objects objects and proxy entities may yield unexpected results during certain operations.

Missing Application: ObjectDBX Classes
Total Number of Proxies: 46
Number of objects (no graphics): 0
Number of entities with no graphics: 0
Number of entities woth bounding box graphics: 0
Number of entities with real graphics metafile: 0

Missing Application: AC DB_MLEADERSTYLE_CLASS
Total Number of Proxies: 1
Number of objects (no graphics): 1
Number of entities with no graphics: 0
Number of entities with bounding box graphics: 0
Number of entities with real graphics metafile: 0
Pressed "OK" and could see the graphic

Quote:
RE: oBlocks appended at the end of the list.
You could either include an list offset and entity count in the new Insert Block Entity class.
but I think that would be harder to fill than a separate lookup table.
The way I envision it.
Read all entities including Insert Block entities into the oList adding unique blocknames to a table.
Record the total length of Entities so when reading the list we do not overshoot the end.
Next Read All blocks from the blocks section.
Add them one at a time adding their starting offset and length to the table.
That puts all the data in place.
the table could be a Dictionary object where quick lookups are built in.
Then quick lookups are used to transfer the Insert Blocks entities (and their unique blocknames) from the Dictionary table somehow to the treeview control?

In that case I guess the tree simply represents a view onto this data model --sort of an MVC multi-tier way of doing things and I'm sure there is a whole bunch of VB.Net code available showing displaying hierarchical data in a treeview control bound to a Dictionary table (ha ha - guess I'm going to do yet more research.. ).

Just out of curiosity I typed in "new Insert Block Entity class" in google and got two hits:
http://www.codeproject.com/Articles/...D-Format-Files

This link had a nice all-too-true paragraph:
Quote:
The problem is that DXF and DWG formats are really complicated. They have dozens of objects with hundreds of interaction tricks and thousands of properties. Official DXF Reference from Autodesk has 256 pages though it fails to describe many important facts. Hence, the development for CAD drawings is often required but is not easy to implement
(bolding emphasis is mine).

http://www.woutware.com/doc/cadlib3....677d3bea5c.htm

Of course the first link is for C# code and the second relies on the Cadkey dll, but the second did give me a list of supported entity types (my comments in green):
Quote:
WW.Cad.Model.Entities.DxfEntity
WW.Cad.Model.Entities.Dxf3DFace -definitely will not support
WW.Cad.Model.Entities.DxfBlockBegin
WW.Cad.Model.Entities.DxfBlockEnd
WW.Cad.Model.Entities.DxfCircle
WW.Cad.Model.Entities.DxfDimension - ???
WW.Cad.Model.Entities.DxfEllipse
WW.Cad.Model.Entities.DxfHatch
WW.Cad.Model.Entities.DxfInsertBase
WW.Cad.Model.Entities.DxfLeader - ???
WW.Cad.Model.Entities.DxfLine
WW.Cad.Model.Entities.DxfLwPolyline
WW.Cad.Model.Entities.DxfMeshFace
WW.Cad.Model.Entities.DxfMLine
WW.Cad.Model.Entities.DxfModelerGeometry - ???
WW.Cad.Model.Entities.DxfMText
WW.Cad.Model.Entities.DxfPoint
WW.Cad.Model.Entities.DxfPolylineBase
WW.Cad.Model.Entities.DxfRasterImage
WW.Cad.Model.Entities.DxfRay
WW.Cad.Model.Entities.DxfSequenceEnd - ???
WW.Cad.Model.Entities.DxfShape
WW.Cad.Model.Entities.DxfSolid
WW.Cad.Model.Entities.DxfSpline
WW.Cad.Model.Entities.DxfText
WW.Cad.Model.Entities.DxfTolerance -???
WW.Cad.Model.Entities.DxfVertex
WW.Cad.Model.Entities.DxfViewport
WW.Cad.Model.Entities.DxfXLine
Quote:
Other than rare cases I think a dxf that did not support hatching wouldn't be to a show stopper
So I'm guessing that means you recommend the code that loads dxf structures should just skip over hatches (not load them into oList or oBlock)?

Last edited by surfR2911; 02-15-2012 at 01:18 AM.
Reply With Quote
  #47  
Old 02-15-2012, 02:05 PM
Gruff's Avatar
GruffDXF Viewer with Measure Gruff is offline
Bald Mountain Survivor

Retired Moderator
* Expert *
 
Join Date: Aug 2003
Location: Oregon, USA - deceased
Posts: 6,440
Default

The Base Entities Minus Spline.dxf was exported from AutoCad 2011 as a version 2000 DXF file.
That might be why you are having problems loading it in AutoCad 2002. (Not sure why.)

Can't imagine why it is talking about a shape file. I simply created generic entities...
unless it is something necessary for the font in the text entity exported.
Ah! Here is an overview on Shapes in Autocad. Guess they can affect fonts.


Fonts in general are another issue. If the font on the source PC is not on the target PC then you will have issues.
Some systems load a standard windows font if the specified font is not found.

Quote:
Then quick lookups are used to transfer the Insert Blocks entities (and their unique blocknames) from the Dictionary table somehow to the treeview control?
I just checked with our AutoCad guru and he says that block can contain blocks inadfinitem.
Uck. I do not want to go there (Unless I absolutely have to.)
Now your treeview sort of makes sense.

Cadkey went defunct over a decade ago. I believe a japanese outfit bought it and renamed it KeyCreator.
Any information about its export DXF would be way out of date. The list you have there would be Cadkey AutoCAD entities that Cadkey could export.
Not all AutoCAD entities. in some cases specifically Dimensioning I believe they exported most dimension styles as entity pieces that looked like the finished dimension.
Dim Arrow Lines + Dim Text + Dim Tol Text + Dim Leader Lines. This was a workaround for export.
You couldn't edit them as a dimension in Autocad.
Cadkey was after all an Autodesk Competitor. (Price wars included.)

RE: Hatches. Yes. Hatches simply help the viewer to differentiate things in complex drawings.
They are a convention that clarifys blueprint reading.
Used to show parts cut open for a viewing i.e. Section Views.

If you are not creating a blueprint then you have no need for them.
Attached Images
File Type: png BluePrint.png (25.7 KB, 6 views)
__________________
Burn the land and boil the sea
You can't take the sky from me


~T

Last edited by Gruff; 02-15-2012 at 02:22 PM.
Reply With Quote
  #48  
Old 02-16-2012, 02:05 PM
surfR2911 surfR2911 is offline
Contributor
 
Join Date: Oct 2009
Posts: 719
Default The rabbit hole post

Quote:
I just checked with our AutoCad guru and he says that block can contain blocks ad infinitum.
Uck. I do not want to go there (Unless I absolutely have to.)
Now your treeview sort of makes sense.
I actually realized the block nesting had no theoretical limit early on -- reading through the AutoDesk dxf specs.
Having worked with pfb files in Adobe products I also knew the pfb to shp/sfx connection..

What I didn't know (until I read the article you provided a link for) is:
Quote:
The PostScript font facilities in AutoCAD are intended to process a subset of Adobe fonts.
..of course exactly what constitutes and delineates this subset is not probably really well documented anywhere..

Here's the good news:
I have finally been able to get through all the entities code in the PictureBoxEx.

Now the bad news..

In my previous post I mentioned the "MVC multi-tier way of doing things".

Just to be clear I provide a few links.
Wikipedia MVC (Model View Controller) entry
http://en.wikipedia.org/wiki/Model%E...0%93controller

Wikipedia Three-tier architecture article:
http://en.wikipedia.org/wiki/Multitier_architecture

Instead of "Presentation Layer " and "Logic Layer" I like to use
"User Interface Layer " and "Business Logic Layer" as pictured in this diagram:
http://spectrum.ieee.org/images/mar02/images/dighf1.jpg

So what does this have to specifically with this thread?

I said in post #9 of this thread "let the tweaking begin.."
That's all I imagined it would take to "re-wrap" the pictureboxex user control into a new interface.

Gruff was correct in his assessment (back in post #17) that
Quote:
Most likely part of the problem is you are trying to modify the Sample_CAD program before you have a handle on the Viewer Control.
Yes I didn't want to have to recode both the SimpleCad and PictureBoxEx, but working backward through the issues in the User Interface Layer I came to realize there were issues in the Business Logic Layer as well (see the screenshots of unhandled errors in post #14).
There also has been discussion of oBlocks code and/or an oBlockList class - this is also business logic layer code that remains, at this point, unwritten (but sorely needed).
I agreed (in post #24) with Gruff's assessment (in post #22) that the "translator" code needed to be moved from outside the user control and into the container interface.
This represents another "business logic" code adjust.

Even if two of the three layers have to be re-coded, I assumed I could still re-use the Data layer code intact.

Now that I understand the entities code I now realize it doesn't dovetail very neatly into the current AutoCAD® 2012 DXF Reference Standard.

So at this point I now know that the code associated with the Data Layer (which represents the dxf internal data file structures) will have to be re-written as well. *heavy sigh*

Thus, my "tweaking" effort could (probably) end being a total rewrite of not one, not two, but of all three layers!
(and this is before any effort to restructure the code to support non-AutoDeak/AutoCad implementations of dxf files or any other vector file formats).

This leads me to think about the character of Neo in the Matrix movies.
His journey started out innocently enough by following a lead (the white rabbit), which eventually led him down a much longer path when he made the decision to take the red pill.

So at this point I want to thank my Morpheus stand-in (Gruff) for providing the means to take a journey into unseen complexity, but have I another .Net code project (with an April deadline) looming, and since playing around with the dxf viewer has no inherent/in-built deadline, the other project has to take precedence/priority right now.

I'm going to try and carve out some time over the next few weeks working on the flyout form interface (with an Outlook style sidebar)
and if I can get it done before this thread "dies" I'll post a link.
The possibility remains that this user interface "shell" could have file handling (I/O) and validation code added in and, at some point, might introduce code for a plug-in architecture that would support loading of different file types...maybe even a DXF file loader "module" way down the road.

Last edited by surfR2911; 02-16-2012 at 02:12 PM.
Reply With Quote
  #49  
Old 02-16-2012, 03:15 PM
Gruff's Avatar
GruffDXF Viewer with Measure Gruff is offline
Bald Mountain Survivor

Retired Moderator
* Expert *
 
Join Date: Aug 2003
Location: Oregon, USA - deceased
Posts: 6,440
Default

I'll be here when you get back.

I would very much like to see the outline for the architecture you end up with.

As you found out it is not easy to find a lot of useful information about programming for 2D vector Graphics let alone supporting file formats.

The intent of the original post was to provide a glimpse into this world and hopefully inspire others to explore and expand our knowledge base on the topic. I am not suprised that a comprehensive 2D CAD tool will require a complete redesign.

Cheers!
__________________
Burn the land and boil the sea
You can't take the sky from me


~T
Reply With Quote
  #50  
Old 02-29-2012, 06:29 PM
surfR2911 surfR2911 is offline
Contributor
 
Join Date: Oct 2009
Posts: 719
Default Cleaned sample file.

I had a real tough time cleaning the base entities sample file from post#45 of this thread,
so I could get it to cleanly load in AutoCad 2002 without "complaints".

It seems the the shx reference in the dxf file was XREF-ed to something else.
I therefore got to learn a lot more than I wanted to know
about cleaning shx references from dxf files:
Erase shapes and purge references to unavailable shape (SHX) files
(has lisp code and how to add it to AutoCad and get it to execute/run)
Purge Missing shx Files (downloadable Lisp file - see instruction in previous link what to do to run it).
remove unknown SHX files (yet more lisp code - see link one for how to get it to load and run in AutoCAD,
Of course in the end I ended up a file that still had a .shx inside but it seemed like it was changed to something (some standard .shx file) that AutoCad could feel comfortable loading.

To get rid of the other 46 object error reference I had to use
Manusoft's SuperPurge.
The shareware trial version is full functional for 30 days.
It's not a stand alone program, but an AutoCad plugin.
You have to shut down AutoCad (if its already running).
Run the install exe for the SuperPurge plugin.
Re-start AutoCad and there should be a new menu available.

In re: the two attached files..one is the BaseEntitiesminusSpline sample
"cleaned up" and the other is a combined sample.
(screenshot of what the combined dxf sample outlook looks like is attached).

Of course both of these sample files contain elements/blocks not supported by the DXFViewer, so there is still much more work to be down.

I should note that there has been a little chit-chat about redesigning the SimpleCad interface in this thread.
Attached Images
File Type: jpg screenshot_cleaned_combines_dxf_file_sample.jpg (85.0 KB, 11 views)
Attached Files
File Type: zip BE-minus_spline_cleaned_dxf_file.zip (4.1 KB, 9 views)
File Type: zip BE-minus_spline_cleaned_combined_sample_dxf_file.zip (18.6 KB, 8 views)

Last edited by surfR2911; 02-29-2012 at 06:34 PM.
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off

Forum Jump

Advertisement:





Free Publications
The ASP.NET 2.0 Anthology
101 Essential Tips, Tricks & Hacks - Free 156 Page Preview. Learn the most practical features and best approaches for ASP.NET.
subscribe
Programmers Heaven C# School Book -Free 338 Page eBook
The Programmers Heaven C# School book covers the .NET framework and the C# language.
subscribe
Build Your Own ASP.NET 3.5 Web Site Using C# & VB, 3rd Edition - Free 219 Page Preview!
This comprehensive step-by-step guide will help get your database-driven ASP.NET web site up and running in no time..
subscribe
DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure DXF Viewer with Measure
DXF Viewer with Measure
DXF Viewer with Measure
 
DXF Viewer with Measure
DXF Viewer with Measure
 
-->