I'm porting some C++ drawing creation code where one of the usual operations is to create named views in model and then those views are attached into separate drawing file. One option is to have setting to specify that views is hidden line view, where instead of using the saved views directly from the model, the views are processed to hidden line files and those are used with drawing. The old hidden line removal code uses mdlView_findNamedElmdscr, which is removed from CONNECT. How can this be converted to CONNECT? The CE version needs to behave exactly like V8i version.
Below is simplified version of V8i code to provide idea what the code is doing.
int view_number = 7, buffer_size; ULong buffer[50]; UShort typemask[8], levelmask[8]; MSElementDescr *eldP; UInt32 filePos; DgnModelRefP hln_file; mdlView_findNamedElmdscr(&eldP, &filePos, viewName, NULL, mdlModelRef_getActive()); // Attach named view to viewport 8 if (!mdlView_isActive(view_number)) mdlView_turnOn(view_number); mdlView_attachNamed(viewName, NULL, view_number); mdlWorkDgn_createFile(&hln_file, fileName, DGNFILE_FORMAT_V8, ACTIVEMODEL, SEED_CopyDefaultData, NULL, NULL, TRUE); // Scan design file header information, to be copied into the memset(typemask, 0, sizeof(typemask)); typemask[0] = TMSK0_DGNFIL_HEADER; typemask[4] = TMSK4_MICROSTATION_ELM; memset(levelmask, 0xffff, sizeof(levelmask)); buffer_size = sizeof(buffer) / sizeof(ULong); // Returns a buffer of filePositions of elements that are // of type defined in the typemask buffer and are on a level // defined in the levelmask buffer. dppDrawing_findElementsOfTypeOnLevel(typemask, levelmask, buffer, buffer_size, &nr_found); // Write design file header information into hidden line output file for (i = 0; i < nr_found; i++) { mdlElmdscr_read(&eldP, buffer[i], MASTERFILE, FALSE, NULL); mdlWorkDgn_write(eldP, -1, hln_file); mdlElmdscr_freeAll(&eldP); } // Write saved view information mdlElmdscr_read(&eldP, filePos, MASTERFILE, FALSE, NULL); mdlWorkDgn_write(eldP, -1, hln_file); mdlElmdscr_freeAll(&eldP); // Start hidden line removal // Filemask is set to include master file and all reference files mdlView_hiddenLineRemoval3(preFunction, visibleFunction, invisibleFunction, view_number, modelRefListP, 0.0, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE); // Close hidden line file mdlWorkDgn_saveChanges(hln_file); mdlWorkDgn_closeFile(hln_file); // Close view 8 mdlView_turnOff(view_number);
Does the NamedView class help?
#include <DgnPlatform/NamedView.h>
Regards, Jon Summers LA Solutions
DgnFileP dgnFile = mdlModelRef_getDgnFile (mdlModelRef_getActive()); NamedViewCollectionCR namedViewCollection = dgnFile->GetNamedViews(); for each (NamedViewPtr namedView in namedViewCollection) { // do something with the namedView here. } NamedViewPtr namedView = namedViewCollection.FindByName (L"Kari Heinola", false);
Answer Verified By: Kari Heinola
The problem is not about finding named view, but writing the saved view to hidden line file. That is, replacing code like below where removed function mdlView_findNamedElmdscr is used to get saved view filePos and mdlElmdscr_read and mdlWorkDgn_write are used to save it to work file. UInt32 filePos; MSElementDescr *eldP; mdlView_findNamedElmdscr(&eldP, &filePos, viewName, NULL, mdlModelRef_getActive()); mdlElmdscr_read(&eldP, filePos, MASTERFILE, FALSE, NULL); mdlWorkDgn_write(eldP, -1, hln_file);
Unknown said:The problem is not about finding named view, but writing the saved view to hidden line file
What about NamedView.CopyAndConvertToFile(DgnFileR destination)?
See also INamedViewElementHandler.
I have tried using code below but the resulting file has no saved views.
DgnFileP destination = hln_file->GetDgnFileP(); NamedViewPtr nm = namedView->CopyAndConvertToFile(*destination);
For the current issue of copying saved view to work file, a simplified V8i code to convert to CE is like below.
DgnModelRefP hln_file; MSElementDescr* eldP; UInt32 filePos; mdlWorkDgn_createFile(&hln_file, filename, DGNFILE_FORMAT_V8, ACTIVEMODEL, SEED_CopyDefaultData, NULL, NULL,TRUE); mdlView_findNamedElmdscr(&eldP, &filePos, viewName, NULL, ACTIVEMODEL); mdlElmdscr_read(&eldP, filePos, ACTIVEMODEL, FALSE, NULL); mdlWorkDgn_write(eldP, -1, hln_file); mdlElmdscr_freeAll(&eldP); mdlWorkDgn_saveChanges(hln_file); mdlWorkDgn_closeFile(hln_file);