A few weeks ago, I posted a little macro that extracted the XYZ values for polylines and saved them out to a txt file. This allowed you to then build a surface with a boatload of data with very little overhead in your actual dwg file. I tested it on 975,000 points and the surface built in less than a minute on a Cannon beta.
Well, now here comes something even better. Our good friend Rob Todd at Autodesk one-upped me and sent this little routine that creates an FLT file from polylines. With his permission, I’ve posted the routine. Read on to find out how it works, what the dvb module name is, and for an example of the output.
Download the DVB file called “Breakline (flt) File Generator.dvb†(the attached zip contains the original polylinethingy.dvb too). This macro creates a FLT file that is the same name as the DWG and in the same location.
The obvious advantage of this marco is that is that each selected polyline object is treated as a breakline, rather than just points extracted from the polyline. Therefore, the resulting is a surface with similar contours. (The Minimize Flat Areas may still need to be used as a subsequent operation.)
The macro creates an Autodesk Breakline Fault (flt) file (See Civil 3D Help). The following is an example of the format:
S1529.639450 179.318779 100.250000 Polyline1
1188.918348 357.736453 101.420000
1021.998725 330.653391 103.530000
594.008485 610.044279 102.870000
761.574952 744.929530 104.780000
610.233298 754.220180 103.410000
570.572642 923.626865 100.980000
S1542.258750 179.318779 0.000000 Polyline2
1190.721102 350.527660 0.000000
860.816542 446.044194 0.000000
588.600214 619.055276 0.000000
608.430540 743.406990 0.000000
565.164367 925.429066 0.000000
Below is the code in the macro:
‘———————————————
Public Sub Breakline_Flt_File()
Dim obj As AcadObject
Dim pt As Variant
Dim fso As New FileSystemObject
Dim ts As TextStream
Dim sPath As String
Dim sFile As String
sPath = ThisDrawing.Path
sFile = ThisDrawing.Name
Set ts = fso.CreateTextFile(sPath + “\” + sFile + “.flt”, True)
Dim nItems As Integer
nItems = ThisDrawing.ActiveSelectionSet.Count
For n = 0 To nItems – 1 Step 1
Dim iSelected As Integer
iSelected = ThisDrawing.ActiveSelectionSet.Count
Set obj = ThisDrawing.ActiveSelectionSet.Item(n)
If TypeOf obj Is AcadLWPolyline Then
Dim pts As Variant
Dim poly As AcadLWPolyline
Set poly = obj
pts = poly.Coordinates
Dim icount As Integer
icount = UBound(pts)
Dim i As Integer
For i = 0 To icount – 1 Step 2
If i = 0 Then
ts.WriteLine “S” & pts(i) & ” ” & pts(i + 1) & ” ” & poly.Elevation & ” ” & “Polyline” & Format(n + 1)
Else
ts.WriteLine ” ” & pts(i) & ” ” & pts(i + 1) & ” ” & poly.Elevation
End If
Next i
End If
Next n
End Sub
‘———————————————————-
As always, use at your own risk and no tech support is offered. Other than that, Enjoy!
Great concept for making large data sets easier to handle! One problem: I am having trouble getting the routine to run from the macro dialog box. When run, there is no apparent response. Are there some particular steps we need to follow to run the code? Thanks for all of your efforts to smooth out our C3D trials.
i am trying to run the breakline flt writer in C3D 2008 and it willl make the file but it is an empty file. What am i doing wrong?
I don’t believe it’s been updated in sometime. It might not work in 2008, or it might, but you’d have to update references.
It does work in 2008. There is an order to it – I just don’t recall – but I did it last month. It did take me a couple of tries to complete.