void SoUnknownNode::createFromIsA(SoMFString *isA) // //////////////////////////////////////////////////////////////////////// { for (int i = 0; i < isA->getNum(); i++) { SoType t = SoType::fromName((*isA)[i]); if (t.canCreateInstance() && t.isDerivedFrom(SoNode::getClassTypeId())) { SoNode *alternateRep = (SoNode *)t.createInstance(); alternateRep->ref(); #ifdef DEBUG if (alternateRep == NULL) { SoDebugError::post("SoUnknownNode::createFromIsA", "SoType.createInstance returned " "NULL (type %s)", t.getName().getString()); return; } #endif // Copy over all fields that are shared: int num = instanceFieldData->getNumFields(); for (int j=0; j<num; j++) { const SbName &fieldName = instanceFieldData->getFieldName(j); SoField *f = instanceFieldData->getField(this, j); // Don't copy over fields with default values: if (f->isDefault()) continue; SoField *nf = alternateRep->getField(fieldName); if (nf != NULL && nf->getTypeId() == f->getTypeId()) { nf->copyFrom(*f); if (f->isConnectedFromField()) { SoField *cf; f->getConnectedField(cf); nf->connectFrom(cf); } else if (f->isConnectedFromEngine()) { SoEngineOutput *eo; f->getConnectedEngine(eo); nf->connectFrom(eo); } } } // And if alternateRep is a group, copy over hidden // children: if (alternateRep->isOfType(SoGroup::getClassTypeId())) { SoGroup *g = (SoGroup *)alternateRep; for (int kid = 0; kid < hiddenChildren.getLength(); kid++) { g->addChild(hiddenChildren[kid]); } } addChild(alternateRep); return; } } }
void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::saveHomePosition(void) { SoType t = getSoRenderManager()->getCamera()->getTypeId(); assert(t.isDerivedFrom(SoNode::getClassTypeId())); assert(t.canCreateInstance()); if(m_storedcamera) { m_storedcamera->unref(); } m_storedcamera = (SoNode*)t.createInstance(); m_storedcamera->ref(); m_storedcamera->copyFieldValues(getSoRenderManager()->getCamera()); }
/*! Registers a concrete SoForeignFileKit subtype to be a handler for files with the given extension. One class can be a handler for multiple filename extensions. FIXME: \e identify is not implemented */ SbBool SoForeignFileKit::registerFileExtension(SoType handler, SbName extension, SoForeignFileIdentifyFunc * COIN_UNUSED_ARG(identify)) { assert(SoForeignFileKitP::fileexts != NULL); assert(handler.canCreateInstance()); if (extension.getString()[0] == '.') { #if COIN_DEBUG SoDebugError::post("SoForeignFileKit::registerFileExtension", "Do not include the extension separator '.' " "when registering file extension."); #endif // COIN_DEBUG } if (SoForeignFileKitP::fileexts->put(extension.getString(), handler)) { return TRUE; } return FALSE; }
/*! Try creating a node of name \a name with Inventor version \a ivversion. Returns NULL if no such node exists. */ SoBase * SoUpgrader::tryCreateNode(const SbName & name, const float ivversion) { if ((ivversion == 1.0f) || (ivversion == 2.0f)) { soupgrader_init_classes(); SbString s(name.getString()); s += (ivversion == 1.0f) ? "V10" : "V20"; if (soupgrader_exists(s.getString())) { SoType type = SoType::fromName(SbName(s.getString())); if (type.canCreateInstance()) { SoBase * b = (SoBase*) type.createInstance(); if (SoInputP::debug()) { SoDebugError::postInfo("SoUpgrader::tryCreateNode", "name=='%s', ivversion==%f => SoBase==%p", name.getString(), ivversion, b); } return b; } } } return NULL; }