Hi I am taking NX standard views and export to them to a PPT in standard format, I am facing problem with the scale. The view scale is not aligned to each other due to the capture size and fit view (Width and Height is not same when the image is compressed to standard size, View fit is also causing the issue). Is that possible to Make the capture area square and Properly fit, so the views will look aligned. Will this one will help me to define the frame "ufs.Disp.CreateFramedImage"? for this what has to be the upleftcorner value
Option Strict Off
Imports System
Imports System.IOImports System.Windows.FormsImports System.DrawingImports System.Drawing.ImagingImports System.CollectionsImports System.Runtime.InteropServicesImports NXOpen
Imports NXOpen.GeometricUtilitiesImports NXOpen.UFImports NXOpen.AssembliesImports NXOpenUI
Imports System.Collections.GenericImports System.ThreadingImports Microsoft.OfficeImports Microsoft.Office.Interop.PowerPointImports Microsoft.Office.InteropImports Microsoft.Office.Interop.Excel
Module OnePagerToolNX
Dim theSession As Session = Session.GetSession()Dim workPart As Part = theSession.Parts.WorkDim displayPart As Part = theSession.Parts.DisplayDim theUI As UI = UI.GetUIDim ufs As UFSession = UFSession.GetUFSessionDim lw As ListingWindow = theSession.ListingWindow'Dim AppPowerPoint As PowerPoint.Application = Nothing'Dim ActiveSlide As PowerPoint.Slide = Nothing'Dim ActivePresentation As PowerPoint.Presentation = NothingDim AppPowerPoint AsObject=Nothing' NX Doesnot support Powerpoint or Office ObjectsDim ActiveSlide AsObject=NothingDim ActivePresentation AsObject=NothingDim RefFileName AsString=NothingDim RefPresentation AsObject=NothingDim RefSlide AsObject=NothingDim ModelParts AsNew ArrayList
Dim AssyParts AsNew ArrayList
Dim MyPart As Part =NothingDim PowerpointFileName AsString=NothingDim PowerpointFileExists AsBoolean=FalseDim basePart1 As BasePart =NothingDim allParts()As Part =Nothing
Sub Main()
lw.Open()
Dim ParentPartNo AsString=NothingDim ParentPartRev AsString=NothingDim ParentPartName AsString=NothingDim CurrentDate AsString= System.DateTime.Today
ParentPartNo ="X"'workPart.GetStringAttribute("DB_PART_NO")
ParentPartRev ="Y"'workPart.GetStringAttribute("DB_PART_REV")
ParentPartName ="Z"'workPart.GetStringAttribute("DB_PART_NAME")
'Create Powerpoint File and Save it in user defined locationDim SaveFileDialog1 AsNew SaveFileDialog
With SaveFileDialog1
.Title="Save OnePager to Presentation File".InitialDirectory="C:\".Filter="PowerpointFiles (*.pptx)|*.pptx|Macro enabled Powerpoint files (*.pptm)|*.pptm|All files (*.*)|*.*".FilterIndex=1.RestoreDirectory=True.OverwritePrompt=False.FileName= ParentPartNo &"- One Pager Presentation"If.ShowDialog()= DialogResult.OKThen
PowerpointFileName =.FileNameElseExitSubEndIfEndWith
If AppPowerPoint IsNothingThen
AppPowerPoint =CreateObject("PowerPoint.Application")
If AppPowerPoint IsNothingThen
theUI.NXMessageBox.Show("Error", NXMessageBox.DialogType.Error, "Could not start Powerpoint, journal exiting")ExitSubEndIfEndIf
AppPowerPoint.Visible=True
If File.Exists(PowerpointFileName)Then
PowerpointFileExists =True
ActiveSlide = AppPowerPoint.Presentations.Open(PowerpointFileName)Else
ActivePresentation = AppPowerPoint.Presentations.Add()
ActivePresentation.SaveAs(PowerpointFileName)EndIf
If ActivePresentation IsNothingThen
theUI.NXMessageBox.Show("Error", NXMessageBox.DialogType.Error, "Could not open Powerpoint file: "& PowerpointFileName & ControlChars.NewLine&"journal exiting.")ExitSubEndIf
RefPresentation = AppPowerPoint.Presentations.Open("C:\MyTemplate.pptx")
For i AsInteger=1To RefPresentation.Slides.Count
RefPresentation.Slides.Item(i).Copy()
ActivePresentation.Slides.Paste()'ActivePresentation.Slides.Item(i).Design = RefPresentation.Slides.Item(i).Design()Next i
RefPresentation.Close()
Dim Titlebox AsObject=NothingDim DateBox AsObject=Nothing
Titlebox = ActivePresentation.slides(1).Shapes.AddTextbox(1, 20, 150, 400, 30)With Titlebox.TextFrame.TextRange.Text= ParentPartNo &"/"& ParentPartRev &" : "& ParentPartName
.Font.Bold=True.Font.Name="Times New Roman".Font.Size=15EndWith
DateBox = ActivePresentation.slides(1).Shapes.AddTextbox(1, 20, 260, 150, 15)With DateBox.TextFrame.TextRange.Text= CurrentDate.ToString.Font.Bold=False.Font.Name="Times New Roman".Font.Size=11EndWith
'Categorize Assembly and Parts in the current session
allParts = theSession.Parts.ToArray()ForEach Part1 As Part In allParts
Dim thisTag As NXOpen.Tag= ufs.Assem.AskRootPartOcc(Part1.Tag)If thisTag = NXOpen.Tag.NullThen
ModelParts.Add(Part1)Else
AssyParts.Add(Part1)EndIfNext
'Export all Parts Detail to Powerpoint
ForEach Part2 As Part In AssyParts
MyPart = Part2
Call CreatePPT()Next
ForEach Part3 As Part In ModelParts
MyPart = Part3
Call CreatePPT()Next
'ActivePresentation.Slides(2).Delete()
ActivePresentation.Save()
ActivePresentation.Close()
AppPowerPoint.Quit()
AppPowerPoint =Nothing
ActivePresentation =Nothing
ActiveSlide =Nothing
EndSubSub CreatePPT()
Dim Partno AsString=Nothing
Dim MyPartLoadStatus As PartLoadStatus =NothingDim SDPSstatus As PartCollection.SdpsStatus=Nothing
SDPSstatus = theSession.Parts.SetDisplay(MyPart, False, False, MyPartLoadStatus)Dim tempScreenshot AsStringDim tempLocation AsString="C:\Temp"
'Getting Part AttributesTry
Partno = MyPart.GetStringAttribute("DB_PART_NO")Catch ex As NXException
lw.WriteLine("Partno Not found"& ex.ErrorCode&":"& ex.Message.ToString)
Partno ="Not Found"EndTry
'Capture ViewsDim Mylayout As Layout =Nothing'Hide unwanted Items in ViewDim visibleObjects()As DisplayableObject =NothingTry
Mylayout =CType(MyPart.Layouts.FindObject("L1"), Layout)Const OtheritemLayer AsInteger=6'Const Solidlayer As Integer = 1Dim Isoview As ModelingView =CType(MyPart.ModelingViews.FindObject("Isometric"), ModelingView)
Mylayout.ReplaceView(MyPart.ModelingViews.WorkView, Isoview, True)
visibleObjects = MyPart.ModelingViews.WorkView.AskVisibleObjects()ForEach Obj As DisplayableObject In visibleObjects
IfTypeOf(Obj)Is DatumPlane Then
Obj.Layer= OtheritemLayer
Obj.RedisplayObject()EndIfIfTypeOf(Obj)Is CoordinateSystem Then
Obj.Layer= OtheritemLayer
Obj.RedisplayObject()EndIfIfTypeOf(Obj)Is DatumAxis Then
Obj.Layer= OtheritemLayer
Obj.RedisplayObject()EndIfIfTypeOf(Obj)Is Curve Then
Obj.Layer= OtheritemLayer
Obj.RedisplayObject()EndIf
IfTypeOf(Obj)Is Sketch Then
Obj.Layer= OtheritemLayer
Obj.RedisplayObject()EndIf
Next
MyPart.Layers.SetState(1, Layer.State.WorkLayer)
MyPart.Layers.SetState(6, Layer.State.Hidden)Catch ex As NXException
lw.WriteLine(Partno &": Layers are not correct Please Check Image-"& ex.ErrorCode&":"& ex.Message.ToString)EndTry
TryDim currentScale AsDouble= workPart.ModelingViews.WorkView.Scale
workPart.ModelingViews.WorkView.Fit()
workPart.ModelingViews.WorkView.SetScale(currentScale)Catch ex As Exception
lw.WriteLine(Partno & ex.Message.ToString&"View Scale failed")EndTryTryDim Isoview As ModelingView =CType(MyPart.ModelingViews.FindObject("Isometric"), ModelingView)
Mylayout.ReplaceView(MyPart.ModelingViews.WorkView, Isoview, True)
MyPart.ModelingViews.WorkView.RenderingStyle= NXOpen.View.RenderingStyleType.ShadedWithEdges
tempScreenshot = IO.Path.Combine(tempLocation, Partno &"- ISO.jpg")
ExportScreenshot(tempScreenshot)
Catch ex As NXException
lw.WriteLine(Partno &": ISO View Not Generated-"& ex.ErrorCode&":"& ex.Message.ToString)EndTry'Capture Front ViewTryDim Frontview As ModelingView =CType(MyPart.ModelingViews.FindObject("Front"), ModelingView)
Mylayout.ReplaceView(MyPart.ModelingViews.WorkView, Frontview, True)
MyPart.ModelingViews.WorkView.RenderingStyle= NXOpen.View.RenderingStyleType.ShadedWithEdges
tempScreenshot = IO.Path.Combine(tempLocation, Partno &"- Front.jpg")
ExportScreenshot(tempScreenshot)
Catch ex As NXException
lw.WriteLine(Partno &": Front View Not Generated-"& ex.ErrorCode&":"& ex.Message.ToString)EndTry
'Capture Left ViewTryDim Leftview As ModelingView =CType(MyPart.ModelingViews.FindObject("Left"), ModelingView)
Mylayout.ReplaceView(MyPart.ModelingViews.WorkView, Leftview, True)
MyPart.ModelingViews.WorkView.RenderingStyle= NXOpen.View.RenderingStyleType.ShadedWithEdges
tempScreenshot = IO.Path.Combine(tempLocation, Partno &"- Left.jpg")
ExportScreenshot(tempScreenshot)
Catch ex As NXException
lw.WriteLine(Partno &": Left View Not Generated-"& ex.ErrorCode&":"& ex.Message.ToString)EndTry
'Capture Top ViewTryDim Topview As ModelingView =CType(MyPart.ModelingViews.FindObject("Top"), ModelingView)
Mylayout.ReplaceView(MyPart.ModelingViews.WorkView, Topview, True)
MyPart.ModelingViews.WorkView.RenderingStyle= NXOpen.View.RenderingStyleType.ShadedWithEdges
tempScreenshot = IO.Path.Combine(tempLocation, Partno &"- Top.jpg")
ExportScreenshot(tempScreenshot)
Catch ex As NXException
lw.WriteLine(Partno &": Top View Not Generated-"& ex.ErrorCode&":"& ex.Message.ToString)EndTry
AppPowerPoint.ActivePresentation.Slides.AddSlide(AppPowerPoint.ActivePresentation.Slides.Count+1, AppPowerPoint.ActivePresentation.SlideMaster.CustomLayouts(7))
AppPowerPoint.ActiveWindow.View.GotoSlide(AppPowerPoint.ActivePresentation.Slides.Count)
ActiveSlide = AppPowerPoint.ActivePresentation.Slides(AppPowerPoint.ActivePresentation.Slides.Count)'Adding Images from Temporary LocationTry
ActiveSlide.Shapes.AddPicture(tempLocation &"\"& Partno &"- ISO.jpg", False, True, 40, 60, 200, 200)
ActiveSlide.Shapes.AddPicture(tempLocation &"\"& Partno &"- Left.jpg", False, True, 40, 280, 200, 200)
ActiveSlide.Shapes.AddPicture(tempLocation &"\"& Partno &"- Top.jpg", False, True, 280, 60, 200, 200)
ActiveSlide.Shapes.AddPicture(tempLocation &"\"& Partno &"- Front.jpg", False, True, 280, 280, 200, 200)Catch ex As Exception
lw.WriteLine(Partno &": Image Not added-"& ex.Message.ToString)EndTry
ForEach Myshape AsObjectIn ActiveSlide.Shapes
Myshape.Select()
Myshape.Line.Transparency=1
Myshape.Line.Weight=1
Myshape.Line.Visible=1Next
EndSub
Sub ExportScreenshot(ByVal filename AsString)
'save user preference for visibility of WCS, triad, view name, and view borderDim wcsVisible AsBoolean= theSession.Parts.BaseDisplay.WCS.VisibilityDim triadVisible AsInteger= theSession.Preferences.ScreenVisualization.TriadVisibilityDim displayModelViewNames AsBoolean= theSession.Parts.BaseDisplay.Preferences.NamesBorderVisualization.ShowModelViewNamesDim displayModelViewBorders AsBoolean= theSession.Parts.BaseDisplay.Preferences.NamesBorderVisualization.ShowModelViewBorders
'turn off the WCS, triad, view name, and view border
theSession.Parts.BaseDisplay.WCS.Visibility=False
theSession.Preferences.ScreenVisualization.TriadVisibility=True
theSession.Parts.BaseDisplay.Preferences.NamesBorderVisualization.ShowModelViewBorders=False
theSession.Parts.BaseDisplay.Preferences.NamesBorderVisualization.ShowModelViewNames=False
Try
ufs.Disp.CreateImage(filename, UFDisp.ImageFormat.Jpeg, UFDisp.BackgroundColor.White)'Dim Upleftcorner() As Integer = Nothing'Upleftcorner(0) = 0'Upleftcorner(1) = 0'ufs.Disp.CreateFramedImage(filename, UFDisp.ImageFormat.Jpeg, UFDisp.BackgroundColor.White, Upleftcorner, 200, 200)Catch ex As Exception
MsgBox(ex.Message& ControlChars.NewLine& _
"'"& filename &"' could not be created")ThrowNew Exception("Screenshot could not be created")Finally'reset visibility of WCS, triad, view name, and view border to user's preference
theSession.Parts.BaseDisplay.WCS.Visibility= wcsVisible
theSession.Preferences.ScreenVisualization.TriadVisibility= triadVisible
theSession.Parts.BaseDisplay.Preferences.NamesBorderVisualization.ShowModelViewBorders= displayModelViewBorders
theSession.Parts.BaseDisplay.Preferences.NamesBorderVisualization.ShowModelViewNames= displayModelViewNames
EndTry
EndSub
PublicFunction GetUnloadOption(ByVal dummy AsString)AsInteger'Unloads the image immediately after execution within NX
GetUnloadOption = NXOpen.Session.LibraryUnloadOption.Immediately
EndFunction
EndModule