void PVUnionArray::setCapacity(size_t capacity) { if(this->isCapacityMutable()) { checkLength(capacity); const_svector value; swap(value); if(value.capacity()<capacity) { svector mvalue(thaw(value)); mvalue.reserve(capacity); value = freeze(mvalue); } swap(value); } else THROW_EXCEPTION2(std::logic_error, "capacity immutable"); }
void PVUnionArray::setLength(size_t length) { if(this->isImmutable()) THROW_EXCEPTION2(std::logic_error, "immutable"); const_svector value; swap(value); if (length == value.size()) return; checkLength(length); if (length < value.size()) { value.slice(0, length); } else { svector mvalue(thaw(value)); mvalue.resize(length); value = freeze(mvalue); } swap(value); }
EDELIB_NS_BEGIN // Set 'pathname' of specified menuitem // If finditem==NULL, mvalue() is used (the most recently picked menuitem) // Returns: // 0 : OK // -1 : item not found (name="") // -2 : 'name' not large enough (name="") // #define SAFE_STRCAT(s) \ { len += strlen(s); if ( len >= namelen ) { *name='\0'; return(-2); } else strcat(name,(s)); } int MenuBase::item_pathname(char *name, int namelen, const MenuItem *finditem) const { int len = 0; finditem = finditem ? finditem : mvalue(); name[0] = '\0'; for ( int t=0; t<size(); t++ ) { const MenuItem *m = &(menu()[t]); if ( m->submenu() ) { // submenu? descend if (*name) SAFE_STRCAT("/"); if (m->label()) SAFE_STRCAT(m->label()); } else { if (m->label()) { // menu item? if ( m == finditem ) { // found? tack on itemname, done. SAFE_STRCAT("/"); SAFE_STRCAT(m->label()); return(0); } } else { // end of submenu? pop char *ss = strrchr(name, '/'); if ( ss ) { *ss = 0; len = strlen(name); } // "File/Edit" -> "File" else { name[0] = '\0'; len = 0; } // "File" -> "" continue; } } } *name = '\0'; return(-1); // item not found }
// TODO: make evalAttr finds more robust MStatus PRTAttrs::createAttributes(MFnDependencyNode & node, const std::wstring & ruleFile, const std::wstring & startRule, prt::AttributeMapBuilder* aBuilder, const prt::RuleFileInfo* info) { MStatus stat; MStatus stat2; MFnNumericData numericData; MFnTypedAttribute tAttr; MFnStringData attrDefaultStr; PRTNode* prtNode = (PRTNode*)node.userNode(); MString dummy; MayaCallbacks* outputHandler = prtNode->createOutputHandler(0, 0); const prt::AttributeMap* attrs = aBuilder->createAttributeMap(); prt::InitialShapeBuilder* isb = prt::InitialShapeBuilder::create(); isb->setGeometry( UnitQuad::vertices, UnitQuad::vertexCount, UnitQuad::indices, UnitQuad::indexCount, UnitQuad::faceCounts, UnitQuad::faceCountsCount ); isb->setAttributes( ruleFile.c_str(), startRule.c_str(), UnitQuad::seed, L"", attrs, prtNode->mResolveMap ); const prt::InitialShape* shape = isb->createInitialShapeAndReset(); prt::generate(&shape, 1, 0, &ENC_ATTR, 1, &prtNode->mAttrEncOpts, outputHandler, PRTNode::theCache, 0); const std::map<std::wstring, MayaCallbacks::AttributeHolder>& evalAttrs = outputHandler->getAttrs(); prtNode->mBriefName2prtAttr[NAME_GENERATE.asWChar()] = NAME_GENERATE.asWChar(); for(size_t i = 0; i < info->getNumAttributes(); i++) { PRTEnum* e = nullptr; const MString name = MString(info->getAttribute(i)->getName()); MObject attr; if(info->getAttribute(i)->getNumParameters() != 0) continue; prtNode->mBriefName2prtAttr[prtu::toCleanId(name).asWChar()] = name.asWChar(); switch(info->getAttribute(i)->getReturnType()) { case prt::AAT_BOOL: { for(size_t a = 0; a < info->getAttribute(i)->getNumAnnotations(); a++) { const prt::Annotation* an = info->getAttribute(i)->getAnnotation(a); if(!(wcscmp(an->getName(), ANNOT_RANGE))) e = new PRTEnum(prtNode, an); } bool value = evalAttrs.find(name.asWChar())->second.mBool; if(e) { MCHECK(addEnumParameter(node, attr, name, value, e)); } else { MCHECK(addBoolParameter(node, attr, name, value)); } break; } case prt::AAT_FLOAT: { double min = std::numeric_limits<double>::quiet_NaN(); double max = std::numeric_limits<double>::quiet_NaN(); for(size_t a = 0; a < info->getAttribute(i)->getNumAnnotations(); a++) { const prt::Annotation* an = info->getAttribute(i)->getAnnotation(a); if(!(wcscmp(an->getName(), ANNOT_RANGE))) { if(an->getNumArguments() == 2 && an->getArgument(0)->getType() == prt::AAT_FLOAT && an->getArgument(1)->getType() == prt::AAT_FLOAT) { min = an->getArgument(0)->getFloat(); max = an->getArgument(1)->getFloat(); } else e = new PRTEnum(prtNode, an); } } double value = evalAttrs.find(name.asWChar())->second.mFloat; if(e) { MCHECK(addEnumParameter(node, attr, name, value, e)); } else { MCHECK(addFloatParameter(node, attr, name, value, min, max)); } break; } case prt::AAT_STR: { MString exts; bool asFile = false; bool asColor = false; for(size_t a = 0; a < info->getAttribute(i)->getNumAnnotations(); a++) { const prt::Annotation* an = info->getAttribute(i)->getAnnotation(a); if(!(wcscmp(an->getName(), ANNOT_RANGE))) e = new PRTEnum(prtNode, an); else if(!(wcscmp(an->getName(), ANNOT_COLOR))) asColor = true; else if(!(wcscmp(an->getName(), ANNOT_DIR))) { exts = MString(an->getName()); asFile = true; } else if(!(wcscmp(an->getName(), ANNOT_FILE))) { asFile = true; for(size_t arg = 0; arg < an->getNumArguments(); arg++) { if(an->getArgument(arg)->getType() == prt::AAT_STR) { exts += MString(an->getArgument(arg)->getStr()); exts += " (*."; exts += MString(an->getArgument(arg)->getStr()); exts += ");;"; } } exts += "All Files (*.*)"; } } std::wstring value = evalAttrs.find(name.asWChar())->second.mString; MString mvalue(value.c_str()); if(!(asColor) && mvalue.length() == 7 && value[0] == L'#') asColor = true; if(e) { MCHECK(addEnumParameter(node, attr, name, mvalue, e)); } else if(asFile) { MCHECK(addFileParameter(node, attr, name, mvalue, exts)); } else if(asColor) { MCHECK(addColorParameter(node, attr, name, mvalue)); } else { MCHECK(addStrParameter(node, attr, name, mvalue)); } break; } default: break; } } shape->destroy(); attrs->destroy(); delete outputHandler; return MS::kSuccess; }