Base point in associative array

Base point in associative array

Anonymous
Not applicable
1,116 Views
9 Replies
Message 1 of 10

Base point in associative array

Anonymous
Not applicable

Hello !

I was created array entity by array command of autocad.I used LI command , return base point ,for example is A point. Then i edit it ; i set base point is a new value , and I used LI command , return base point is no change.How is base point ? How to get base point ? ( i used AcDbAssocArrayActionBody::getSourceBasePoint ,just return that A point )

0 Likes
1,117 Views
9 Replies
Replies (9)
Message 2 of 10

Alexander.Rivilis
Mentor
Mentor

Array (associative) is a sample of AcDbBlockReference class. So you have to use AcDbBlockReference::position method.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

0 Likes
Message 3 of 10

Anonymous
Not applicable

Thanks for your reply !

But I just retrieve a point :AcGePoint3d(0,0,0) when used that method : 

AcDbBlockReference::position
0 Likes
Message 4 of 10

Alexander.Rivilis
Mentor
Mentor

Without your's code I can not find bug in it. Compare two pictures:

2014-09-13_12-38-12.png

 

2014-09-13_12-39-05.png

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

0 Likes
Message 5 of 10

Alexander.Rivilis
Mentor
Mentor

Also this topic and sample can help you: http://forums.autodesk.com/t5/objectarx/associative-array/td-p/4343871

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

0 Likes
Message 6 of 10

Anonymous
Not applicable

Thanks you ! 

I want say about Array Path ; I changed continue base point but Geometry ( Base X , Base Y , Base Z) not changed!

0 Likes
Message 7 of 10

Alexander.Rivilis
Mentor
Mentor

Try to explain your's problem in more detail with code, images, dwg-file. Otherwise you'll never get help.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

0 Likes
Message 8 of 10

Anonymous
Not applicable

I'm sorry ! This is my problem .User draw one array path 

Source is a line : start point (X= 19.5580  Y=  11.8961  Z=   0.0000)  ; end point ( X=  17.7793  Y=   8.2770  Z=   0.0000)

Path is a line : start point (X=  26.9032  Y=  12.3896  Z=   0.0000 ) ; end point ( X=  22.5554  Y=   7.5861  Z=   0.0000 )

Untitled.pngUntitled1.png

0 Likes
Message 9 of 10

Anonymous
Not applicable

Now , i'll read that array path . 

AcDbObjectId networkId = AssocUtils::getAssocNetwork(false, UtilFunctions::getBlockRecordId(ACDB_MODEL_SPACE));	
	if(networkId != AcDbObjectId::kNull)
	{				
		AcDbObjectPointer<AcDbAssocNetwork> pNetwork(networkId, kForRead);				
		if (pNetwork.openStatus() != eOk)
			return false;
		const AcDbObjectIdArray& actionsInNetwork = pNetwork->getActions();
		for (int nCount = 0; nCount < actionsInNetwork.length(); nCount++)
		{
			const AcDbObjectId& actionId = actionsInNetwork[nCount];
			if (actionId == AcDbObjectId::kNull)
				continue;
			AcDbObjectPointer<AcDbAssocAction> pAction(actionId, kForRead);
			if (pAction.openStatus() != eOk)
				continue;
			AcDbAssocAction *pAcation = pAction.object();
			AcDbObjectId id = pAcation->actionBody();
			AcDbHardOwnershipId OwnershipId (id);
			
			AcDbObjectPointer<AcDbObject>pObj(OwnershipId,AcDb::kForWrite);
			CString s = pObj->isA()->name();
			/////////////
			const AcDbAssocArrayActionBody *pArrayActionBody = AcDbAssocArrayActionBody::cast(pObj);
			const AcDbAssocArrayParameters *pArrayParameters = pArrayActionBody->parameters();
			AcDbObjectIdArray ids = pArrayActionBody->getSourceEntities();
			AcDbObjectPointer<AcDbEntity> pEnt(ids[0],AcDb::kForWrite);
			AcDbLine *pline = AcDbLine::cast(pEnt);
			AcGePoint3d startP = pline->startPoint();
			AcGePoint3d EndP = pline->endPoint();
			AcDbVertexRef vertexRef ;
			AcGePoint3d position;
			es = pArrayActionBody->getSourceBasePoint(vertexRef,position);



		}
	}		

 I get source entities .It is not origin source entities ! Because ( startP , EndP ) are other values .How do I can get correct source entities ? 

  Is correct the path to get AcDbAssocArrayActionBody ? It is begin at getAssocNetwork ,etc ...

And I get the base point (X=  22.5554  Y=   7.5861  Z=   0.0000) .Base point is position !

Temporary forget source entities is not correct . Now I'll redraw that array path .

AcDbLine *pPath = new AcDbLine(AcGePoint3d( 26.9032 , 12.3896 , 0.0000),AcGePoint3d(22.5554 ,  7.5861  ,  0.0000));
	AcDbLine *pSource = new AcDbLine(AcGePoint3d( 19.5580 ,  11.8961  ,   0.0000),AcGePoint3d(17.7793 ,  8.2770 ,  0.0000));
	AcDbObjectId idSource = UtilFunctions::postToDb(pSource);
	AcDbObjectId idPath = UtilFunctions::postToDb(pPath);
	AcDbObjectIdArray sourceEntites;
	sourceEntites.append(idSource);
	AcDbVertexRef basePoint(AcGePoint3d(22.555400,7.586100,0.000000));
	AcDbEdgeRef edge(pPath);

	double itemSpacing = 4; 
	double rowSpacing = 5.42865; 
	double levelSpacing = 1; 
	int itemCount = 2; 
	int rowCount = 1;
	int levelCount = 1;
	double rowElevation = 0;

	AcDbAssocArrayPathParameters *pPathParameters = new AcDbAssocArrayPathParameters(itemSpacing,rowSpacing,levelSpacing,
		itemCount,rowCount,levelCount,rowElevation);

	pPathParameters->setPath(edge);
	pPathParameters->setMethod(AcDbAssocArrayPathParameters::kMeasure);
	pPathParameters->setPathDirection(false);
	
	AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
	Acad::ErrorStatus es ;
	AcDbObjectId arrayId; 
	AcDbObjectId actionBodyId;

	es = AcDbAssocArrayActionBody::createInstance (sourceEntites,basePoint,pPathParameters,arrayId,actionBodyId);
	bool k = AcDbAssocManager::evaluateTopLevelNetwork(pDb,NULL,0);

 Code for UtilFunctions::postToDb

AcDbObjectId postToDb(AcDbEntity* pEnt)
{
	Acad::ErrorStatus es;
	AcDbObjectId objId;
	AcDbBlockTable* pBlockTable = NULL;	
	if (acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead)== Acad::eOk) 
	{
		AcDbBlockTableRecord*  pSpaceRecord = NULL;		
		CString mode =  acdbCurDwg()->tilemode() ? ACDB_MODEL_SPACE : ACDB_PAPER_SPACE ;
		es =  pBlockTable->getAt( ACDB_MODEL_SPACE,pSpaceRecord,AcDb::kForWrite);
		if (es == Acad::eOk) 
		{
			pEnt->setDatabaseDefaults(acdbCurDwg());
			pSpaceRecord->appendAcDbEntity(objId, pEnt);
			pEnt->close();
			pSpaceRecord->close();						
		}				
		pBlockTable->close();
	}	
	return objId;
}

 Finally result : It is unlike with origin . Please explain to me , why is ?

Thanks you !

Untitled2.png

 

 

 

 
0 Likes
Message 10 of 10

Anonymous
Not applicable

Please help me ! This problem is difficult with me !

0 Likes