0000572: add a method to Part module to read BRep data from string
git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5410 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d
This commit is contained in:
parent
0496df6538
commit
a75fb03407
|
@ -40,6 +40,7 @@
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
#include "Swap.h"
|
#include "Swap.h"
|
||||||
#include "FileInfo.h"
|
#include "FileInfo.h"
|
||||||
|
#include <CXX/Objects.hxx>
|
||||||
|
|
||||||
using namespace Base;
|
using namespace Base;
|
||||||
|
|
||||||
|
@ -535,6 +536,58 @@ IODeviceIStreambuf::seekpos(std::streambuf::pos_type pos,
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
|
PyStreambuf::PyStreambuf(PyObject* o) : inp(o)
|
||||||
|
{
|
||||||
|
setg (buffer+pbSize,
|
||||||
|
buffer+pbSize,
|
||||||
|
buffer+pbSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
int PyStreambuf::underflow()
|
||||||
|
{
|
||||||
|
if (gptr() < egptr()) {
|
||||||
|
return *gptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
int numPutback;
|
||||||
|
numPutback = gptr() - eback();
|
||||||
|
if (numPutback > pbSize) {
|
||||||
|
numPutback = pbSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy (buffer+(pbSize-numPutback), gptr()-numPutback, numPutback);
|
||||||
|
|
||||||
|
int num=0;
|
||||||
|
for (int i=0; i<bufSize; i++) {
|
||||||
|
char c;
|
||||||
|
Py::Tuple arg(1);
|
||||||
|
arg.setItem(0, Py::Int(1));
|
||||||
|
Py::Callable meth(Py::Object(inp).getAttr("read"));
|
||||||
|
try {
|
||||||
|
Py::Char res(meth.apply(arg));
|
||||||
|
c = static_cast<std::string>(res)[0];
|
||||||
|
num++;
|
||||||
|
buffer[pbSize+i] = c;
|
||||||
|
if (c == '\n')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch (Py::Exception& e) {
|
||||||
|
e.clear();
|
||||||
|
if (num == 0)
|
||||||
|
return EOF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setg (buffer+(pbSize-numPutback),
|
||||||
|
buffer+pbSize,
|
||||||
|
buffer+pbSize+num);
|
||||||
|
|
||||||
|
return *gptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
Streambuf::Streambuf(const std::string& data)
|
Streambuf::Streambuf(const std::string& data)
|
||||||
{
|
{
|
||||||
_beg = data.begin();
|
_beg = data.begin();
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
class QByteArray;
|
class QByteArray;
|
||||||
class QIODevice;
|
class QIODevice;
|
||||||
class QBuffer;
|
class QBuffer;
|
||||||
|
typedef struct _object PyObject;
|
||||||
|
|
||||||
namespace Base {
|
namespace Base {
|
||||||
|
|
||||||
|
@ -233,6 +234,21 @@ protected:
|
||||||
char buffer[bufSize+pbSize]; // data buffer
|
char buffer[bufSize+pbSize]; // data buffer
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class BaseExport PyStreambuf : public std::streambuf
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PyStreambuf(PyObject* o);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int underflow();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const int pbSize = 4;
|
||||||
|
static const int bufSize = 1024;
|
||||||
|
char buffer[bufSize+pbSize];
|
||||||
|
PyObject* inp;
|
||||||
|
};
|
||||||
|
|
||||||
class BaseExport Streambuf : public std::streambuf
|
class BaseExport Streambuf : public std::streambuf
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -609,6 +609,32 @@ void TopoShape::importBrep(const char *FileName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TopoShape::importBrep(std::istream& str)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// read brep-file
|
||||||
|
BRep_Builder aBuilder;
|
||||||
|
TopoDS_Shape aShape;
|
||||||
|
#if OCC_HEX_VERSION >= 0x060300
|
||||||
|
Handle_Message_ProgressIndicator pi = new ProgressIndicator(100);
|
||||||
|
pi->NewScope(100, "Reading BREP file...");
|
||||||
|
pi->Show();
|
||||||
|
BRepTools::Read(aShape,str,aBuilder,pi);
|
||||||
|
pi->EndScope();
|
||||||
|
#else
|
||||||
|
BRepTools::Read(aShape,str,aBuilder);
|
||||||
|
#endif
|
||||||
|
this->_Shape = aShape;
|
||||||
|
}
|
||||||
|
catch (Standard_Failure) {
|
||||||
|
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
|
||||||
|
throw Base::Exception(aFail->GetMessageString());
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
throw Base::Exception(e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TopoShape::write(const char *FileName) const
|
void TopoShape::write(const char *FileName) const
|
||||||
{
|
{
|
||||||
Base::FileInfo File(FileName);
|
Base::FileInfo File(FileName);
|
||||||
|
|
|
@ -120,6 +120,7 @@ public:
|
||||||
void importIges(const char *FileName);
|
void importIges(const char *FileName);
|
||||||
void importStep(const char *FileName);
|
void importStep(const char *FileName);
|
||||||
void importBrep(const char *FileName);
|
void importBrep(const char *FileName);
|
||||||
|
void importBrep(std::istream&);
|
||||||
void exportIges(const char *FileName) const;
|
void exportIges(const char *FileName) const;
|
||||||
void exportStep(const char *FileName) const;
|
void exportStep(const char *FileName) const;
|
||||||
void exportBrep(const char *FileName) const;
|
void exportBrep(const char *FileName) const;
|
||||||
|
|
|
@ -48,6 +48,11 @@ Sub-elements such as vertices, edges or faces are accessible as:
|
||||||
<UserDocu>Export the content of this shape to an STL mesh file.</UserDocu>
|
<UserDocu>Export the content of this shape to an STL mesh file.</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="importBrep">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>Import the content to this shape of a string in BREP format.</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Methode Name="extrude">
|
<Methode Name="extrude">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Extrude the shape along a direction.</UserDocu>
|
<UserDocu>Extrude the shape along a direction.</UserDocu>
|
||||||
|
|
|
@ -311,6 +311,30 @@ PyObject* TopoShapePy::exportBrep(PyObject *args)
|
||||||
Py_Return;
|
Py_Return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* TopoShapePy::importBrep(PyObject *args)
|
||||||
|
{
|
||||||
|
PyObject* input;
|
||||||
|
if (!PyArg_ParseTuple(args, "O", &input))
|
||||||
|
//char* input;
|
||||||
|
//if (!PyArg_ParseTuple(args, "s", &input))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// read brep
|
||||||
|
Base::PyStreambuf buf(input);
|
||||||
|
std::istream str(0);
|
||||||
|
str.rdbuf(&buf);
|
||||||
|
//std::stringstream str(input);
|
||||||
|
getTopoShapePtr()->importBrep(str);
|
||||||
|
}
|
||||||
|
catch (const Base::Exception& e) {
|
||||||
|
PyErr_SetString(PyExc_Exception,e.what());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_Return;
|
||||||
|
}
|
||||||
|
|
||||||
PyObject* TopoShapePy::exportStl(PyObject *args)
|
PyObject* TopoShapePy::exportStl(PyObject *args)
|
||||||
{
|
{
|
||||||
char* filename;
|
char* filename;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user