EF_TEX,
EF_PDF,
EF_SVG,
- EF_PGF
+ EF_PGF,
+ EF_EMF
end ExportFormat;
-- or insufficient system memory available.
---Warning: Works only under Windows.
-
Export( me: mutable;
- FileName : CString from Standard;
- Format : ExportFormat from Graphic3d;
- SortType : SortType from Graphic3d;
- W, H : Integer from Standard;
- View : CView from Graphic3d;
- Under, Over : CLayer2d from Aspect;
- Precision : Real from Standard = 0.005;
- ProgressBarFunc : Address from Standard = NULL;
- ProgressObject : Address from Standard = NULL ) is deferred;
+ theFileName : CString from Standard;
+ theFormat : ExportFormat from Graphic3d;
+ theSortType : SortType from Graphic3d;
+ theWidth, theHeight : Integer from Standard;
+ theView : CView from Graphic3d;
+ theLayerUnder : CLayer2d from Aspect;
+ theLayerOver : CLayer2d from Aspect;
+ thePrecision : Real from Standard = 0.005;
+ theProgressBarFunc : Address from Standard = NULL;
+ theProgressObject : Address from Standard = NULL )
+ returns Boolean from Standard
+ is deferred;
+ ---Purpose:
+ -- Export scene into the one of the Vector graphics formats (SVG, PS, PDF...).
+ -- In contrast to Bitmaps, Vector graphics is scalable (so you may got quality benefits on printing to laser printer).
+ -- Notice however that results may differ a lot and do not contain some elements.
RemovePrimitiveArray( me : mutable;
theCGroup : CGroup from Graphic3d;
/************************************************************************/
-void Graphic3d_GraphicDriver::Export( const Standard_CString FileName,
- const Graphic3d_ExportFormat Format,
- const Graphic3d_SortType aSortType,
- const Standard_Integer W,
- const Standard_Integer H,
- const Graphic3d_CView& View,
- const Aspect_CLayer2d& Under,
- const Aspect_CLayer2d& Over,
- const Standard_Real Precision,
- const Standard_Address ProgressBarFunc,
- const Standard_Address ProgressObject )
+Standard_Boolean Graphic3d_GraphicDriver::Export (const Standard_CString theFileName,
+ const Graphic3d_ExportFormat theFormat,
+ const Graphic3d_SortType theSortType,
+ const Standard_Integer theW,
+ const Standard_Integer theH,
+ const Graphic3d_CView& theView,
+ const Aspect_CLayer2d& theLayerUnder,
+ const Aspect_CLayer2d& theLayerOver,
+ const Standard_Real thePrecision,
+ const Standard_Address theProgressBarFunc,
+ const Standard_Address theProgressObject)
{
+ return Standard_False;
}
Export( me: mutable;
- FileName : CString from Standard;
- Format : ExportFormat from Graphic3d;
- SortType : SortType from Graphic3d;
- W, H : Integer from Standard;
- View : CView from Graphic3d;
- Under, Over : CLayer2d from Aspect;
- Precision : Real from Standard = 0.005;
- ProgressBarFunc : Address from Standard = NULL;
- ProgressObject : Address from Standard = NULL ) is redefined virtual;
+ theFileName : CString from Standard;
+ theFormat : ExportFormat from Graphic3d;
+ theSortType : SortType from Graphic3d;
+ theWidth, theHeight : Integer from Standard;
+ theView : CView from Graphic3d;
+ theLayerUnder : CLayer2d from Aspect;
+ theLayerOver : CLayer2d from Aspect;
+ thePrecision : Real from Standard = 0.005;
+ theProgressBarFunc : Address from Standard = NULL;
+ theProgressObject : Address from Standard = NULL )
+ returns Boolean from Standard
+ is redefined virtual;
+ ---Purpose:
+ -- Export scene into the one of the Vector graphics formats (SVG, PS, PDF...).
+ -- Requires gl2ps library.
+ -- In contrast to Bitmaps, Vector graphics is scalable (so you may got quality benefits on printing to laser printer).
+ -- Notice however that results may differ a lot and do not contain some elements.
+ -- EMF export format requiers modified gl2ps library and available only on Windows platform.
SetDepthTestEnabled( me; view : CView from Graphic3d;
#include <locale.h>
-
-
/************************************************************************/
/* Print Methods */
/************************************************************************/
-void OpenGl_GraphicDriver::Export( const Standard_CString FileName,
- const Graphic3d_ExportFormat Format,
- const Graphic3d_SortType aSortType,
- const Standard_Integer W,
- const Standard_Integer H,
- const Graphic3d_CView& View,
- const Aspect_CLayer2d& Under,
- const Aspect_CLayer2d& Over,
- const Standard_Real Precision,
- const Standard_Address ProgressBarFunc,
- const Standard_Address ProgressObject )
+Standard_Boolean OpenGl_GraphicDriver::Export (const Standard_CString theFileName,
+ const Graphic3d_ExportFormat theFormat,
+ const Graphic3d_SortType theSortType,
+ const Standard_Integer theWidth,
+ const Standard_Integer theHeight,
+ const Graphic3d_CView& theView,
+ const Aspect_CLayer2d& theLayerUnder,
+ const Aspect_CLayer2d& theLayerOver,
+ const Standard_Real /*thePrecision*/,
+ const Standard_Address /*theProgressBarFunc*/,
+ const Standard_Address /*theProgressObject*/)
{
#ifdef HAVE_GL2PS
-
- OSD_Localizer locate(LC_NUMERIC,"C");
-
- Standard_Integer mode = -1;
- Standard_Integer sortType = Graphic3d_ST_BSP_Tree;
- switch( Format )
+ Standard_Integer aFormat = -1;
+ Standard_Integer aSortType = Graphic3d_ST_BSP_Tree;
+ switch (theFormat)
{
- case Graphic3d_EF_PostScript:
- mode = GL2PS_PS;
- break;
- case Graphic3d_EF_EnhPostScript:
- mode = GL2PS_EPS;
- break;
- case Graphic3d_EF_TEX:
- mode = GL2PS_TEX;
- break;
- case Graphic3d_EF_PDF:
- mode = GL2PS_PDF;
- break;
- case Graphic3d_EF_SVG:
- mode = GL2PS_SVG;
- break;
- case Graphic3d_EF_PGF:
- mode = GL2PS_PGF;
- break;
+ case Graphic3d_EF_PostScript:
+ aFormat = GL2PS_PS;
+ break;
+ case Graphic3d_EF_EnhPostScript:
+ aFormat = GL2PS_EPS;
+ break;
+ case Graphic3d_EF_TEX:
+ aFormat = GL2PS_TEX;
+ break;
+ case Graphic3d_EF_PDF:
+ aFormat = GL2PS_PDF;
+ break;
+ case Graphic3d_EF_SVG:
+ aFormat = GL2PS_SVG;
+ break;
+ case Graphic3d_EF_PGF:
+ aFormat = GL2PS_PGF;
+ break;
+ case Graphic3d_EF_EMF:
+ //aFormat = GL2PS_EMF;
+ aFormat = GL2PS_PGF + 1; // 6
+ break;
+ default:
+ // unsupported format
+ return Standard_False;
}
- switch( aSortType )
+ switch (theSortType)
{
- case Graphic3d_ST_Simple:
- sortType = GL2PS_SIMPLE_SORT;
- break;
- case Graphic3d_ST_BSP_Tree:
- sortType = GL2PS_BSP_SORT;
- break;
- }
+ case Graphic3d_ST_Simple:
+ aSortType = GL2PS_SIMPLE_SORT;
+ break;
+ case Graphic3d_ST_BSP_Tree:
+ aSortType = GL2PS_BSP_SORT;
+ break;
+ }
+
+ GLint aViewport[4];
+ aViewport[0] = 0;
+ aViewport[1] = 0;
+ aViewport[2] = theWidth;
+ aViewport[3] = theHeight;
- GLint viewport[4];
- viewport[0] = 0;
- viewport[1] = 0;
- viewport[2] = W;
- viewport[3] = H;
+ GLint aBufferSize = 1024 * 1024;
+ GLint anErrCode = GL2PS_SUCCESS;
- GLint buffersize = 1024*1024;
+ // gl2ps uses standard write functions and do not check locale
+ OSD_Localizer locate (LC_NUMERIC, "C");
- while( buffersize>0 )
+ while (aBufferSize > 0)
{
- FILE *file = fopen(FileName,"wb");
- gl2psBeginPage( "", "", viewport, mode, sortType,
+ // current patch for EMF support in gl2ps uses WinAPI functions to create file
+ FILE* aFileH = (theFormat != Graphic3d_EF_EMF) ? fopen (theFileName, "wb") : NULL;
+ anErrCode = gl2psBeginPage ("", "", aViewport, aFormat, aSortType,
GL2PS_DRAW_BACKGROUND | GL2PS_OCCLUSION_CULL | GL2PS_BEST_ROOT/* | GL2PS_SIMPLE_LINE_OFFSET*/,
GL_RGBA, 0, NULL,
- 0, 0, 0, buffersize, file, FileName);
-
- Redraw( View, Under, Over );
-
- GLint num = gl2psEndPage();
-
- fclose(file);
-
- if( num==GL2PS_OVERFLOW )
- buffersize *= 2;
- else
- break;
+ 0, 0, 0, aBufferSize, aFileH, theFileName);
+ if (anErrCode != GL2PS_SUCCESS)
+ {
+ // initialization failed
+ if (aFileH != NULL)
+ fclose (aFileH);
+ break;
+ }
+ Redraw (theView, theLayerUnder, theLayerOver);
+
+ anErrCode = gl2psEndPage();
+ if (aFileH != NULL)
+ fclose (aFileH);
+
+ if (anErrCode == GL2PS_OVERFLOW)
+ aBufferSize *= 2;
+ else
+ break;
}
locate.Restore();
-
+ return anErrCode == GL2PS_SUCCESS;
+#else
+ return Standard_False;
#endif
-
}
//==============================================================================
//function : VExport
-//purpose : Export teh view to a vector graphic format (PS, EMF, PDF)
+//purpose : Export the view to a vector graphic format (PS, EMF, PDF)
//==============================================================================
static int VExport(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
Handle(V3d_View) V3dView = ViewerTest::CurrentView();
- if ( V3dView.IsNull() ) return 1;
+ if (V3dView.IsNull())
+ return 1;
- if ( argc != 3 ) {
- di << argv[0] << "Invalid number of arguments" << "\n";
+ if (argc == 1)
+ {
+ std::cout << "Usage: " << argv[0] << " Filename [Format]\n";
return 1;
}
- TCollection_AsciiString aFormat( argv[2] );
- aFormat.UpperCase();
- Graphic3d_ExportFormat exFormat;
- if ( aFormat == "PS" )
- exFormat = Graphic3d_EF_PostScript;
- if ( aFormat == "EPS" )
- exFormat = Graphic3d_EF_EnhPostScript;
- if ( aFormat == "TEX" )
- exFormat = Graphic3d_EF_TEX;
- if ( aFormat == "PDF" )
- exFormat = Graphic3d_EF_PDF;
- if ( aFormat == "SVG" )
- exFormat = Graphic3d_EF_SVG;
- if ( aFormat == "PGF" )
- exFormat = Graphic3d_EF_PGF;
- V3dView->View()->Export( argv[1], exFormat );
+ Graphic3d_ExportFormat anExpFormat = Graphic3d_EF_PDF;
+ TCollection_AsciiString aFormatStr;
+
+ TCollection_AsciiString aFileName (argv[1]);
+ Standard_Integer aLen = aFileName.Length();
+
+ if (argc > 2)
+ {
+ aFormatStr = TCollection_AsciiString (argv[2]);
+ }
+ else if (aLen >= 4)
+ {
+ if (aFileName.Value (aLen - 2) == '.')
+ {
+ aFormatStr = aFileName.SubString (aLen - 1, aLen);
+ }
+ else if (aFileName.Value (aLen - 3) == '.')
+ {
+ aFormatStr = aFileName.SubString (aLen - 2, aLen);
+ }
+ else
+ {
+ std::cout << "Export format couln't be detected from filename '" << argv[1] << "'\n";
+ return 1;
+ }
+ }
+ else
+ {
+ std::cout << "Export format couln't be detected from filename '" << argv[1] << "'\n";
+ return 1;
+ }
+
+ aFormatStr.UpperCase();
+ if (aFormatStr == "PS")
+ anExpFormat = Graphic3d_EF_PostScript;
+ else if (aFormatStr == "EPS")
+ anExpFormat = Graphic3d_EF_EnhPostScript;
+ else if (aFormatStr == "TEX")
+ anExpFormat = Graphic3d_EF_TEX;
+ else if (aFormatStr == "PDF")
+ anExpFormat = Graphic3d_EF_PDF;
+ else if (aFormatStr == "SVG")
+ anExpFormat = Graphic3d_EF_SVG;
+ else if (aFormatStr == "PGF")
+ anExpFormat = Graphic3d_EF_PGF;
+ else if (aFormatStr == "EMF")
+ anExpFormat = Graphic3d_EF_EMF;
+ else
+ {
+ std::cout << "Invalid export format '" << aFormatStr << "'\n";
+ return 1;
+ }
+
+ if (!V3dView->View()->Export (argv[1], anExpFormat))
+ {
+ std::cout << "Export failed!\n";
+ return 1;
+ }
return 0;
}
"vpan : vpan dx dy",
__FILE__,VPan,group);
theCommands.Add("vexport",
- "vexport : vexport full_file_path {PS | EPS | TEX | PDF | SVG | PGV } : exports the view to a vector file of a given format",
+ "vexport : vexport full_file_path {PS | EPS | TEX | PDF | SVG | PGF | EMF }"
+ " : exports the view to a vector file of a given format"
+ " : notice that EMF format requires patched gl2ps",
__FILE__,VExport,group);
theCommands.Add("vcolorscale",
"vcolorscale : vcolorscale [RangeMin = 0 RangeMax = 100 Intervals = 10 HeightFont = 16 Position = 2 X = 0 Y = 0]: draw color scale",
-- currently used in triedron displaying
Export( me;
- FileName : CString from Standard;
- Format : ExportFormat from Graphic3d;
- SortType : SortType from Graphic3d = Graphic3d_ST_BSP_Tree;
- Precision : Real from Standard = 0.005;
- ProgressBarFunc : Address from Standard = NULL;
- ProgressObject : Address from Standard = NULL );
+ theFileName : CString from Standard;
+ theFormat : ExportFormat from Graphic3d;
+ theSortType : SortType from Graphic3d = Graphic3d_ST_BSP_Tree;
+ thePrecision : Real from Standard = 0.005;
+ theProgressBarFunc : Address from Standard = NULL;
+ theProgressObject : Address from Standard = NULL )
+ returns Boolean from Standard;
+ ---Purpose:
+ -- Export scene into the one of the Vector graphics formats (SVG, PS, PDF...).
+ -- In contrast to Bitmaps, Vector graphics is scalable (so you may got quality benefits on printing to laser printer).
+ -- Notice however that results may differ a lot and do not contain some elements.
fields
#endif
}
-void Visual3d_View::Export( const Standard_CString FileName,
- const Graphic3d_ExportFormat Format,
- const Graphic3d_SortType aSortType,
- const Standard_Real Precision,
- const Standard_Address ProgressBarFunc,
- const Standard_Address ProgressObject ) const
+Standard_Boolean Visual3d_View::Export (const Standard_CString theFileName,
+ const Graphic3d_ExportFormat theFormat,
+ const Graphic3d_SortType theSortType,
+ const Standard_Real thePrecision,
+ const Standard_Address theProgressBarFunc,
+ const Standard_Address theProgressObject) const
{
- Handle( Visual3d_Layer ) AnUnderLayer = MyViewManager->UnderLayer(),
- AnOverLayer = MyViewManager->OverLayer();
+ Handle(Visual3d_Layer) anUnderLayer = MyViewManager->UnderLayer();
+ Handle(Visual3d_Layer) anOverLayer = MyViewManager->OverLayer();
- Aspect_CLayer2d OverCLayer;
- Aspect_CLayer2d UnderCLayer;
- OverCLayer.ptrLayer = UnderCLayer.ptrLayer = NULL;
+ Aspect_CLayer2d anOverCLayer;
+ Aspect_CLayer2d anUnderCLayer;
+ anOverCLayer.ptrLayer = anUnderCLayer.ptrLayer = NULL;
- if( !AnOverLayer.IsNull() )
- OverCLayer = AnOverLayer->CLayer();
- if( !AnUnderLayer.IsNull() )
- UnderCLayer = AnUnderLayer->CLayer();
+ if (!anOverLayer.IsNull())
+ anOverCLayer = anOverLayer->CLayer();
+ if (!anUnderLayer.IsNull())
+ anUnderCLayer = anUnderLayer->CLayer();
- Standard_Integer W, H;
- Window()->Size( W, H );
+ Standard_Integer aWidth, aHeight;
+ Window()->Size (aWidth, aHeight);
- MyGraphicDriver->Export( FileName, Format, aSortType, W, H, MyCView, UnderCLayer, OverCLayer,
- Precision, ProgressBarFunc, ProgressObject );
+ return MyGraphicDriver->Export (theFileName, theFormat, theSortType,
+ aWidth, aHeight, MyCView, anUnderCLayer, anOverCLayer,
+ thePrecision, theProgressBarFunc, theProgressObject);
}