void SoIntersectionDetectionAction::apply(SoNode * node) { // Keep this around, as it's handy for dumping a stand-alone scene // to work with from an invocation within an application framework. #if 0 // disabled SoOutput out; SbBool ok = out.openFile("/tmp/assembly.wrl"); assert(ok); SoWriteAction wa(&out); wa.apply(node); out.closeFile(); #endif // disabled PRIVATE(this)->reset(); // Needs a bounding box for the full scene, for later initialization // of the SbOctTree of shape bounding boxes. SbViewportRegion vp; SoGetBoundingBoxAction bboxaction(vp); bboxaction.apply(node); PRIVATE(this)->fullxfbbox = bboxaction.getXfBoundingBox(); if (ida_debug()) { // debug SoGetPrimitiveCountAction counter; counter.apply(node); SoDebugError::postInfo("SoIntersectionDetectionAction::apply", "number of triangle primitives in scene: %d", counter.getTriangleCount()); } PRIVATE(this)->traverser->apply(node); SbTime starttime; if (ida_debug()) { // debug starttime = SbTime::getTimeOfDay(); SoDebugError::postInfo("SoIntersectionDetectionAction::apply", "calling doIntersectionTesting()..."); } PRIVATE(this)->doIntersectionTesting(); if (ida_debug()) { // debug SoDebugError::postInfo("SoIntersectionDetectionAction::apply", "doIntersectionTesting() done after %f seconds.", (SbTime::getTimeOfDay() - starttime).getValue()); } }
PyObject* Application::sExport(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/) { PyObject* object; char* Name; if (!PyArg_ParseTuple(args, "Oet",&object,"utf-8",&Name)) return NULL; std::string Utf8Name = std::string(Name); PyMem_Free(Name); PY_TRY { App::Document* doc = 0; Py::Sequence list(object); for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { PyObject* item = (*it).ptr(); if (PyObject_TypeCheck(item, &(App::DocumentObjectPy::Type))) { App::DocumentObject* obj = static_cast<App::DocumentObjectPy*>(item)->getDocumentObjectPtr(); doc = obj->getDocument(); break; } } QString fileName = QString::fromUtf8(Utf8Name.c_str()); QFileInfo fi; fi.setFile(fileName); QString ext = fi.suffix().toLower(); if (ext == QLatin1String("iv") || ext == QLatin1String("wrl") || ext == QLatin1String("vrml") || ext == QLatin1String("wrz")) { // build up the graph SoSeparator* sep = new SoSeparator(); sep->ref(); for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { PyObject* item = (*it).ptr(); if (PyObject_TypeCheck(item, &(App::DocumentObjectPy::Type))) { App::DocumentObject* obj = static_cast<App::DocumentObjectPy*>(item)->getDocumentObjectPtr(); Gui::ViewProvider* vp = Gui::Application::Instance->getViewProvider(obj); if (vp) { sep->addChild(vp->getRoot()); } } } SoGetPrimitiveCountAction action; action.setCanApproximate(true); action.apply(sep); bool binary = false; if (action.getTriangleCount() > 100000 || action.getPointCount() > 30000 || action.getLineCount() > 10000) binary = true; SoFCDB::writeToFile(sep, Utf8Name.c_str(), binary); sep->unref(); } else if (ext == QLatin1String("pdf")) { // get the view that belongs to the found document Gui::Document* gui_doc = Application::Instance->getDocument(doc); if (gui_doc) { Gui::MDIView* view = gui_doc->getActiveView(); if (view) { View3DInventor* view3d = qobject_cast<View3DInventor*>(view); if (view3d) view3d->viewAll(); QPrinter printer(QPrinter::ScreenResolution); printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFileName(fileName); view->print(&printer); } } } else { Base::Console().Error("File type '%s' not supported\n", ext.toLatin1().constData()); } } PY_CATCH; Py_Return; }