The upper code is a quick (and dirty) adaptation of the one I used to plot layouts to a PDF file.
Publishing a 3d DWF may be a little more simple (removing unsefull lines).
Here's a little class you can instanciate to call the Publish() method:
Dim plot3d As New PlotTo3dDwf("C:\Temp")
plot3d.Publish() C#
using System.IO;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.PlottingServices;
namespace Plottings
{
public class PlotTo3dDwf
{
private string dwgFile, dwfFile, dsdFile, title, outputDir;
public PlotTo3dDwf()
{
outputDir = (string)Application.GetSystemVariable("DWGPREFIX");
string name = (string)Application.GetSystemVariable("DWGNAME");
dwgFile = Path.Combine(outputDir, name);
title = Path.GetFileNameWithoutExtension(name);
dwfFile = Path.ChangeExtension(dwgFile, "dwf");
dsdFile = Path.ChangeExtension(dwfFile, ".dsd");
}
public PlotTo3dDwf(string outputDir) : this ()
{
this.outputDir = outputDir;
}
public void Publish()
{
short bgPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT");
Application.SetSystemVariable("BACKGROUNDPLOT", 0);
if (!Directory.Exists(outputDir))
Directory.CreateDirectory(outputDir);
using (DsdData dsd = new DsdData())
using (DsdEntryCollection dsdEntries = new DsdEntryCollection())
{
// add the Model layout to the entry collection
DsdEntry dsdEntry = new DsdEntry();
dsdEntry.DwgName = dwgFile;
dsdEntry.Layout = "Model";
dsdEntry.Title = title;
dsdEntry.Nps = "0";
dsdEntries.Add(dsdEntry);
dsd.SetDsdEntryCollection(dsdEntries);
// set DsdData
dsd.Dwf3dOptions.PublishWithMaterials = true;
dsd.Dwf3dOptions.GroupByXrefHierarchy = true;
dsd.SetUnrecognizedData("PwdProtectPublishedDWF", "FALSE");
dsd.SetUnrecognizedData("PromptForPwd", "FALSE");
dsd.SheetType = SheetType.SingleDwf;
dsd.NoOfCopies = 1;
dsd.ProjectPath = outputDir;
dsd.IsHomogeneous = true;
if (File.Exists(dsdFile))
File.Delete(dsdFile);
// write the DsdData file
dsd.WriteDsd(dsdFile);
// get the Dsd File contents
string str;
using (StreamReader sr = new StreamReader(dsdFile, Encoding.Default))
{
str = sr.ReadToEnd();
}
// edit the contents
str = str.Replace("Has3DDWF=0", "Has3DDWF=1");
str = str.Replace("PromptForDwfName=TRUE", "PromptForDwfName=FALSE");
// rewrite the Dsd file
using (StreamWriter sw = new StreamWriter(dsdFile, false, Encoding.Default))
{
sw.Write(str);
}
// import the Dsd file contents in the DsdData
dsd.ReadDsd(dsdFile);
File.Delete(dsdFile);
PlotConfig pc = PlotConfigManager.SetCurrentConfig("DWF6 ePlot.pc3");
Application.Publisher.PublishExecute(dsd, pc);
Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot);
}
}
}
} VB
Imports System.IO
Imports System.Text
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.PlottingServices
Namespace Plottings
Public Class PlotTo3dDwf
Private dwgFile, dwfFile, dsdFile, title, outputDir As String
Public Sub New()
outputDir = DirectCast(Application.GetSystemVariable("DWGPREFIX"), String)
Dim name As String = DirectCast(Application.GetSystemVariable("DWGNAME"), String)
dwgFile = Path.Combine(outputDir, name)
title = Path.GetFileNameWithoutExtension(name)
dwfFile = Path.ChangeExtension(dwgFile, "dwf")
dsdFile = Path.ChangeExtension(dwfFile, ".dsd")
End Sub
Public Sub New(outputDir As String)
Me.New()
Me.outputDir = outputDir
End Sub
Public Sub Publish()
Dim bgPlot As Short = CShort(Application.GetSystemVariable("BACKGROUNDPLOT"))
Application.SetSystemVariable("BACKGROUNDPLOT", 0)
If Not Directory.Exists(outputDir) Then
Directory.CreateDirectory(outputDir)
End If
Using dsd As New DsdData()
Using dsdEntries As New DsdEntryCollection()
' add the Model layout to the entry collection
Dim dsdEntry As New DsdEntry()
dsdEntry.DwgName = dwgFile
dsdEntry.Layout = "Model"
dsdEntry.Title = title
dsdEntry.Nps = "0"
dsdEntries.Add(dsdEntry)
dsd.SetDsdEntryCollection(dsdEntries)
' set DsdData data
dsd.Dwf3dOptions.PublishWithMaterials = True
dsd.Dwf3dOptions.GroupByXrefHierarchy = True
dsd.SetUnrecognizedData("PwdProtectPublishedDWF", "FALSE")
dsd.SetUnrecognizedData("PromptForPwd", "FALSE")
dsd.SheetType = SheetType.SingleDwf
dsd.NoOfCopies = 1
dsd.ProjectPath = outputDir
dsd.IsHomogeneous = True
If File.Exists(dsdFile) Then
File.Delete(dsdFile)
End If
' write the DsdData file
dsd.WriteDsd(dsdFile)
' get the Dsd File contents
Dim str As String
Using sr As New StreamReader(dsdFile, Encoding.[Default])
str = sr.ReadToEnd()
End Using
' edit the contents
str = str.Replace("Has3DDWF=0", "Has3DDWF=1")
str = str.Replace("PromptForDwfName=TRUE", "PromptForDwfName=FALSE")
' rewrite the Dsd file
Using sw As New StreamWriter(dsdFile, False, Encoding.[Default])
sw.Write(str)
End Using
' import the Dsd file new contents in the DsdData
dsd.ReadDsd(dsdFile)
File.Delete(dsdFile)
Dim pc As PlotConfig = PlotConfigManager.SetCurrentConfig("DWF6 ePlot.pc3")
Application.Publisher.PublishExecute(dsd, pc)
Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot)
End Using
End Using
End Sub
End Class
End Namespace