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)
	Try
	    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)
		End Using
	    End Using
	Finally
	    Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot)
	End Try
    End Sub
End Class
End Namespace
