bool ccPolyline::fromFile_MeOnly(QFile& in, short dataVersion, int flags) { if (!ccHObject::fromFile_MeOnly(in, dataVersion, flags)) return false; if (dataVersion<28) return false; //as the associated cloud (=vertices) can't be saved directly (as it may be shared by multiple polylines) //we only store its unique ID (dataVersion>=28) --> we hope we will find it at loading time (i.e. this //is the responsibility of the caller to make sure that all dependencies are saved together) uint32_t vertUniqueID = 0; if (in.read((char*)&vertUniqueID,4) < 0) return ReadError(); //[DIRTY] WARNING: temporarily, we set the vertices unique ID in the 'm_associatedCloud' pointer!!! *(uint32_t*)(&m_theAssociatedCloud) = vertUniqueID; //number of points (references to) (dataVersion>=28) uint32_t pointCount = 0; if (in.read((char*)&pointCount,4) < 0) return ReadError(); if (!reserve(pointCount)) return false; //points (references to) (dataVersion>=28) for (uint32_t i=0; i<pointCount; ++i) { uint32_t pointIndex = 0; if (in.read((char*)&pointIndex,4) < 0) return ReadError(); addPointIndex(pointIndex); } QDataStream inStream(&in); //Closing state (dataVersion>=28) inStream >> m_isClosed; //RGB Color (dataVersion>=28) inStream >> m_rgbColor[0]; inStream >> m_rgbColor[1]; inStream >> m_rgbColor[2]; //2D mode (dataVersion>=28) inStream >> m_mode2D; //Foreground mode (dataVersion>=28) inStream >> m_foreground; //Width of the line (dataVersion>=31) if (dataVersion >= 31) ccSerializationHelper::CoordsFromDataStream(inStream,flags,&m_width,1); else m_width = 0; return true; }
bool ccPolyline::initWith(ccPointCloud*& vertices, const ccPolyline& poly) { bool success = true; if (!vertices) { ccPointCloud* cloud = dynamic_cast<ccPointCloud*>(poly.m_theAssociatedCloud); ccPointCloud* clone = cloud ? cloud->partialClone(&poly) : ccPointCloud::From(&poly); if (clone) { if (cloud) clone->setName(cloud->getName()); //as 'partialClone' adds the '.extract' suffix by default else clone->setGLTransformationHistory(poly.getGLTransformationHistory()); } else { //not enough memory? ccLog::Warning("[ccPolyline::initWith] Not enough memory to duplicate vertices!"); success = false; } vertices = clone; } if (vertices) { setAssociatedCloud(vertices); addChild(vertices); //vertices->setEnabled(false); assert(m_theAssociatedCloud); if (m_theAssociatedCloud) addPointIndex(0,m_theAssociatedCloud->size()); } setClosed(poly.m_isClosed); set2DMode(poly.m_mode2D); setForeground(poly.m_foreground); setVisible(poly.isVisible()); lockVisibility(poly.isVisiblityLocked()); setColor(poly.m_rgbColor); setWidth(poly.m_width); showColors(poly.colorsShown()); showVertices(poly.verticesShown()); setVertexMarkerWidth(poly.getVertexMarkerWidth()); setVisible(poly.isVisible()); showArrow(m_showArrow,m_arrowIndex,m_arrowLength); setGlobalScale(poly.getGlobalScale()); setGlobalShift(poly.getGlobalShift()); setGLTransformationHistory(poly.getGLTransformationHistory()); setMetaData(poly.metaData()); return success; }
ccPolyline::ccPolyline(const ccPolyline& poly) : Polyline(ccPointCloud::From(poly.getAssociatedCloud())) , ccHObject("Polyline") { assert(m_theAssociatedCloud); if (m_theAssociatedCloud) addPointIndex(0,m_theAssociatedCloud->size()); setClosingState(poly.m_isClosed); set2DMode(poly.m_mode2D); setForeground(poly.m_foreground); setVisible(poly.isVisible()); lockVisibility(poly.isVisiblityLocked()); setColor(poly.m_rgbColor); }
bool ccPolyline::initWith(ccPointCloud*& vertices, const ccPolyline& poly) { bool success = true; if (!vertices) { ccPointCloud* cloud = dynamic_cast<ccPointCloud*>(poly.m_theAssociatedCloud); ccPointCloud* clone = cloud ? cloud->partialClone(&poly) : ccPointCloud::From(&poly); if (clone) { if (cloud) clone->setName(cloud->getName()); //as 'partialClone' adds the '.extract' suffix by default else clone->setGLTransformationHistory(poly.getGLTransformationHistory()); } else { //not enough memory? ccLog::Warning("[ccPolyline::initWith] Not enough memory to duplicate vertices!"); success = false; } vertices = clone; } if (vertices) { setAssociatedCloud(vertices); addChild(vertices); //vertices->setEnabled(false); assert(m_theAssociatedCloud); if (m_theAssociatedCloud) { if (!addPointIndex(0, m_theAssociatedCloud->size())) { ccLog::Warning("[ccPolyline::initWith] Not enough memory"); success = false; } } } importParametersFrom(poly); return success; }