std::vector<PolygonalObject> Convert(IPObjectStruct* iritObjects) { std::vector<PolygonalObject> res; if (iritObjects == NULL) { return std::vector<PolygonalObject>(); } if (IP_IS_OLST_OBJ(iritObjects)) { std::vector<PolygonalObject> res; res.reserve(iritObjects->U.Lst.ListMaxLen); IPObjectStruct** currObject = iritObjects->U.Lst.PObjList; while ((*currObject) != NULL) { std::vector<PolygonalObject> currRes = Convert(*currObject); res.insert(res.end(), currRes.begin(), currRes.end()); ++currObject; } return res; } else if (IP_IS_POLYGON_OBJ(iritObjects)) { std::vector<PolygonalObject> res; res.push_back(ConvertSingleObject(iritObjects)); return res; } else { throw ConvertError(); } }
PolygonalObject ConvertSingleObject(IPObjectStruct* iritObjects) { if (!IP_IS_POLYGON_OBJ(iritObjects)) { throw ConvertError(); } std::vector<Polygon3D> currPolys; IPPolygonStruct* currPoly = iritObjects->U.Pl; while (currPoly != NULL) { currPolys.push_back(ConvertPolygon(currPoly)); currPoly = currPoly->Pnext; } double transp; bool transpValid = CGSkelGetObjectTransp(iritObjects, &transp); IPAttributeStruct* attrRGB = AttrFindAttribute(iritObjects->Attr, "rgb"); if (attrRGB != NULL) { int r, g, b; sscanf_s(attrRGB->U.Str, "%d,%d,%d", &r, &g, &b); if (transpValid) return PolygonalObject(currPolys, RGB(r, g, b), 1 - transp); else return PolygonalObject(currPolys, RGB(r, g, b)); } { if (transpValid) return PolygonalObject(currPolys, 1 - transp); else return PolygonalObject(currPolys); } }
/***************************************************************************** * DESCRIPTION: * * Dumps one object PObject to file f. * * * * PARAMETERS: * * f: File to dump object to. * * PObject: Object to dump to file f. * * * * RETURN VALUE: * * void * *****************************************************************************/ static void DumpOneObject(FILE *f, IPObjectStruct *PObject) { IPPolygonStruct *PList = NULL; switch (PObject -> ObjType) { case IP_OBJ_POLY: if (IP_IS_POLYGON_OBJ(PObject) || IP_IS_POLYLINE_OBJ(PObject)) PList = PObject -> U.Pl; break; case IP_OBJ_CURVE: case IP_OBJ_SURFACE: IRIT_FATAL_ERROR("Curves and surfaces should have been converted to polylines."); break; default: break; } while (PList) { DumpOnePoly(f, PList, IP_IS_POLYGON_OBJ(PObject)); PList = PList -> Pnext; } }