2018-05-11
	
		
		02:19 PM
	
	
	
	
	
	
	
	
	
	
	
	
	
	
 - last edited on 
    
	
		
		
		2023-05-23
	
		
		04:37 PM
	
	
	
	
	
	
	
	
	
	
	
	
	
	
 by 
				
		
		
			Rubia Torres
		
		
		
		
		
		
		
		
	
			
		
			//initalize element/memo
			API_Element* element;
			API_ObjectType obj;
			API_ElementMemo* elementMemo;
			//API_AddParType** parType;
			elementMemo=new API_ElementMemo;
			element=new API_Element;
			//element pointer
			element->header.typeID=API_ObjectID;
			element->header.floorInd=0;
			element->header.hasMemo=false;
			//initialize obj
			obj=element->object;
			//set obj paramter
			obj.angle=0;
			obj.pos.x=0;
			obj.pos.y=0;
			obj.level=1;
			obj.libInd=1;
			obj.ltypeInd=1;
			obj.pen=1;
			
			
			//write back new object params
			element->object=obj;
			
			//create element
			err=ACAPI_Element_Create(element,elementMemo);
			WriteReport("Element_Create",err);
this gives me APIERR_BADINDEX -2130313114 81060066 The passed index is out of range.error.
			GSErrCode err;
			//get loaded libraries
			GS::Array<API_LibraryInfo> activeLibs;
			Int32 embeddedLibraryIndex;
			err=ACAPI_Environment(APIEnv_GetLibrariesID,&activeLibs,&embeddedLibraryIndex);
			if(err!=NoError){
				WriteReport("GetLibrariesID",err);
			}
			//Loop through libraries and find mep library
			API_LibraryInfo libraryInfo;
			GS::UniString libraryName;
			for (UInt32 i = 0; i < activeLibs.GetSize(); i++) {
				libraryName=activeLibs.name;
				if(libraryName.Contains("MEP Modeler.apx")){
					//Found MEP library
					ACAPI_WriteReport(libraryName.ToCStr(),true);
				}
				
			}
2018-05-12 12:43 AM
Who can do API development?If you don't have that experience, a lot of time is going to be spent cleaning up basic programming errors. I'd recommend the following actions:
API developers have to be experienced in C or C++ programming language
2018-05-13 09:41 PM
element.header.typeID=toolboxItemPipe.typeID; //ElementTypeID element.header.variationID=toolboxItemPipe.variationID; //VariationTypeID element.object.libInd=libIndPipe; //library index3. Get the default memo for the initialized element (NoError)
err=ACAPI_Element_GetDefaults(&element,&memo);4. Verify the memo additional parameters and those looks just fine. DumpParameters implementation from the Docs. (Working)
DumpParameters(element.object.libInd,libPart_Pipe.typeID)5. And here is problem i try to create the element with these initialized parameter, but it gives me an error.
err=ACAPI_Element_Create(&element,&memo); APIERR_REFUSEDCMD -2130312312 81060388 The passed identifier is not subject to the operation.Here is my whole code:
			API_LibPart  libPart;
			API_LibPart  libPart_Pipe={};
			API_LibPart  libPart_PipeBend={};
			API_ToolBoxItem toolboxItemPipe={},toolboxItemPipeBend={};
			Int32        i, count,libIndPipe=0,libIndPipeBend=0;
			GSErrCode    err;
			GS::UniString libPartName;
			//Found out which library elements ID for mep elements...
			err = ACAPI_LibPart_GetNum (&count);
			if (!err) {
				for (i = 1; i <= count; i++) {
					BNZeroMemory (&libPart, sizeof (API_LibPart));
					libPart.index = i;
					err = ACAPI_LibPart_Get (&libPart);
					if (!err) {
						libPartName="Pipe Straight 20";
						if(GS::UniString (libPart.docu_UName)==libPartName){
							libPart_Pipe=libPart;
							libIndPipe=i;
							err=ACAPI_Goodies(APIAny_GetLibPartToolVariationID,&libPart,&toolboxItemPipe);
							if(err){
								WriteReport("APIAny_GetLibPartToolVariationID",err);
							}else{
								WriteReport("toolboxItemPipe.typeID",toolboxItemPipe.typeID);
								WriteReport("toolboxItemPipe.variationID",toolboxItemPipe.variationID);
							}
						}
						libPartName="Pipe Bend 20";
						if(GS::UniString (libPart.docu_UName)==libPartName){
							libPart_PipeBend=libPart;
							libIndPipeBend=i;
							err=ACAPI_Goodies(APIAny_GetLibPartToolVariationID,&libPart,&toolboxItemPipeBend);
							if(err){
								WriteReport("APIAny_GetLibPartToolVariationID",err);
							}else{
								WriteReport("toolboxItemPipeBend.typeID",toolboxItemPipeBend.typeID);
								WriteReport("toolboxItemPipeBend.variationID",toolboxItemPipeBend.variationID);
							}
						}
					}
						if (libPart.location != nullptr)
							delete libPart.location;
				}
			}
			
			//Define element
			API_Element element;
			API_ElementMemo memo;
			//TODO for cycle to read data from CSV line by line
			//Clear element, memo
			BNZeroMemory (&element, sizeof (API_Element));
			BNZeroMemory (&memo, sizeof (API_ElementMemo));
			
			//initialize element.header
			element.header.typeID=toolboxItemPipe.typeID; //ElementTypeID
			element.header.variationID=toolboxItemPipe.variationID; //VariationTypeID
			element.header.floorInd=0;
			element.header.hasMemo=true;
			
			//initialize element.object
			element.object.libInd=libIndPipe; //library index
			/*element.object.level=0; //height from the floor
			element.object.pos.x=0;
			element.object.pos.y=0;
			element.object.angle=0; //element angle
			*/
			WriteReport("element.object.libInd",element.object.libInd);
			//Get memo Defaults 
			err=ACAPI_Element_GetDefaults(&element,&memo);
			if(!err){
				//Element_GetDefaults was successfull
				//Get default parameters
				double a,b;
				Int32 parCount;
				API_AddParType **addPars=nullptr;
				err=ACAPI_LibPart_GetParams(libIndPipe,&a,&b,&parCount,&addPars);
				if(!err){
					WriteReport("Parameters count",parCount);
					//write default parameters to memo
					memo.params=addPars;
					//parCount=1;
					//DumpParameters(element.object.libInd,libPart_Pipe.typeID);
					for(i=0;i<parCount;i++){
						
			        if ((*memo.params).typeMod == API_ParSimple) {
						DumpOneParam ((*memo.params).typeID, (*memo.params).name, (*memo.params).flags,
				(*memo.params).value.real, (*memo.params).value.uStr,
                          0,0);
						}
					}
					//try to create the element
					err=ACAPI_Element_Create(&element,&memo);
					if(!err){
						//element successfully created
						ACAPI_WriteReport("Element created",false);
					}else{
						WriteReport("Element_Create",err);
					}
				}else{
						WriteReport("ACAPI_LibPart_GetParams",err);
				}
			}else{
				WriteReport("Element_GetDefaults",err);
			}
			ACAPI_DisposeElemMemoHdls (&memo);
					
				
			
			
				
			
			
				
			
			
			
			
			
			
		2018-05-13 10:08 PM
2018-05-14 04:41 PM
paramOwner.libInd = element.object.libInd; paramOwner.typeID = element.header.typeID; paramOwner.variationID=element.header.variationID; paramOwner.guid = element.header.guid;2. open parameters (NoError)
err = ACAPI_Goodies (APIAny_OpenParametersID, ¶mOwner, nullptr);3. Created an array of structure to hold the required parameters, and fill that
typedef struct parameter {	char name[32];
							short ID;
							double value;
} parameter;
parameter param[1]={};
strcpy(param[0].name,"MEP_StraightLength"); //that is the parameter name.
param[0].value=2;
param[0].ID=10;
...
4. Get active parameters (NoError) and change them (NoError).
err = ACAPI_Goodies (APIAny_GetActParametersID, &getParams, nullptr); chgParam.index = param5. close opened parameters with success. And set memo.params to the new params. clear mask. Looks fine.ID; CHCopyC (param .name, chgParam.name); chgParam.realValue = param .value; err = ACAPI_Goodies (APIAny_ChangeAParameterID, &chgParam, nullptr); 
err=ACAPI_Goodies (APIAny_CloseParametersID, nullptr, nullptr); memo.params = getParams.params; ACAPI_ELEMENT_MASK_CLEAR(mask);6. Call the change with undoable command... It appears on the previous menu but nothing changed on the element...
err = ACAPI_CallUndoableCommand ("Change Element",
								[&] () -> GSErrCode {
									return ACAPI_Element_Change(&element, &mask, &memo,0,true);
								});
So I don't know whats wrong. Maybe you know something about this element. I tried to change a length(MEP_StraightLength) i can modify from the GUI, but not from the addon, but there is no error  under runtime...2018-06-12 10:58 AM