Đến nội dung


Hình ảnh
- - - - -

[Thảo luận] Điều khiển AutoCAD bằng VC++ (ObjectARX)


  • Please log in to reply
82 replies to this topic

#61 kd.3cdotcom

kd.3cdotcom

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 21 November 2012 - 10:59 AM

Hi. công phu thật. rất hữu ích cho người mới vào nghề học tập !
  • 0

#62 vuxuanhuynh

vuxuanhuynh

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 21 November 2012 - 02:00 PM

Mình đang viết một đoạn code để Insert Block (là file DWG) vào bản vẽ, nhưng đang bị lỗi, các menber sửa giúp mình với

void adskInsertBlock()
{
ACHAR* szName = _T("luanuoc");
ACHAR *fileName = _T("C:\\procad\\dwg\\luanuoc.dwg");
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
AcDbDatabase *pBlockDb = new AcDbDatabase(false,true);
pBlockDb ->readDwgFile(fileName,_SH_DENYRW,true);
AcDbBlockTable *BlkTable;
AcDbObjectId BlkId;
//AcDbObjectIdArray Ids = new AcDbObjectIdArray();
//BlkId =pBlockDb ->blockTableId();
BlkTable ->getAt(ACDB_MODEL_SPACE,BlkId,AcDb::kForRead);
pDb->insert(BlkId,szName,pBlockDb,true);
if (BlkTable->has(BlkId))
{
ads_point p;
acutPrintf("\nDa co Block %s",szName);
acedGetPoint(NULL,"Chon diem chen",p);
AcGePoint3d Inspoint(p[X],p[Y],p[Z]);
AcDbBlockReference *pBlockobj = new AcDbBlockReference;
AcDbBlockTableRecord *pBlkTablerec;
pBlockobj ->setBlockTableRecord(BlkId);
pBlockobj ->setPosition(Inspoint);
pBlockobj ->setScaleFactors(1);
BlkTable ->getAt(ACDB_MODEL_SPACE,pBlkTablerec,AcDb::kForWrite);
BlkTable ->close();
pBlkTablerec ->appendAcDbEntity(pBlockobj);
pBlkTablerec ->close();
pBlockobj ->close();
acutPrintf("\nDa chen Block %s vao ban ve",szName);

}
Thanks
  • 0

#63 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 22 November 2012 - 12:39 AM

Mình chỉ quen cách viết ads thôi, nó giống lisp. Ví dụ viết hàm tạo một loạt các điểm ranh đất theo thứ tự điểm được cung cấp trong một array

int VeTruranh(ads_point *ar, int lr, double tlbd)
{
ads_point p;
for (int i=0;i<lr-1;i++) {
p[0]=ar[i][0];p[1]=ar[i][1];
ads_command(RTSTR,"_.insert",RTSTR,"truranh",RTSTR,"s",RTREAL,tlbd/1000.0,RTPOINT,p,RTREAL,0.0,RTSTR,ads_itoa(i+1),RTNONE);
}
return 0;
}
trong đó :
- "truranh" là tên file (block) có thuộc tính là số hiệu điểm, nó phải có trên bv hoặc trong đường dẫn cad
- tlbd: là tỷ lệ bản đồ.
- ads_itoa( int) : hàm đổi số nguyên thành chuỗi
Cách viết như của bạn mình không rành lắm, đang học hỏi, hôm nào bạn hoàn chỉnh thì mình copy về tham khảo thôi
  • 0

#64 cvmem

cvmem

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: 6 (bình thường)

Đã gửi 22 November 2012 - 09:37 AM

Mình đang viết một đoạn code để Insert Block (là file DWG) vào bản vẽ, nhưng đang bị lỗi, các menber sửa giúp mình với

void adskInsertBlock()
{
ACHAR* szName = _T("luanuoc");
ACHAR *fileName = _T("C:\\procad\\dwg\\luanuoc.dwg");
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
AcDbDatabase *pBlockDb = new AcDbDatabase(false,true);
pBlockDb ->readDwgFile(fileName,_SH_DENYRW,true);
AcDbBlockTable *BlkTable;
AcDbObjectId BlkId;
//AcDbObjectIdArray Ids = new AcDbObjectIdArray();
//BlkId =pBlockDb ->blockTableId();
BlkTable ->getAt(ACDB_MODEL_SPACE,BlkId,AcDb::kForRead);
pDb->insert(BlkId,szName,pBlockDb,true);
if (BlkTable->has(BlkId))
{
ads_point p;
acutPrintf("\nDa co Block %s",szName);
acedGetPoint(NULL,"Chon diem chen",p);
AcGePoint3d Inspoint(p[X],p[Y],p[Z]);
AcDbBlockReference *pBlockobj = new AcDbBlockReference;
AcDbBlockTableRecord *pBlkTablerec;
pBlockobj ->setBlockTableRecord(BlkId);
pBlockobj ->setPosition(Inspoint);
pBlockobj ->setScaleFactors(1);
BlkTable ->getAt(ACDB_MODEL_SPACE,pBlkTablerec,AcDb::kForWrite);
BlkTable ->close();
pBlkTablerec ->appendAcDbEntity(pBlockobj);
pBlkTablerec ->close();
pBlockobj ->close();
acutPrintf("\nDa chen Block %s vao ban ve",szName);

}
Thanks

Block table ban chua co lay ve tu database hien tai ma, chi moi co khai bao 1 pointer roi tu nhien su dung luon.
AcDbBlockTable *BlkTable;
Acad::ErrorStatus es = pDb->getSymbolTable(BlkTable, AcDb::kForRead);
// luc nay moi su dung block table de lay ve model space nhu tren dc
BlkTable->close();
  • 0

#65 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 22 November 2012 - 02:24 PM

Code Insert 1 Block từ 1 bản vẽ khác vào bản vẽ Active.


static void th_ArxProject1_HelloWorld_InsertBlock(void)
{
// Add your code for command th_ArxProject1_HelloWorld._InsertBlock here
AcDbDatabase *pDbSource = new AcDbDatabase(Adesk::kFalse);

ACHAR *fName = _T("D:\\DwgEx.dwg");
ACHAR *BlkName = _T("dirpoint");

Acad::ErrorStatus err = pDbSource->readDwgFile(fName);
if(err != Acad::eOk)
{
delete pDbSource;
return;
}
AcDbDatabase *pDbDest = acdbHostApplicationServices()->workingDatabase();

AcDbObjectId Id = getBlockId(pDbSource, pDbDest, BlkName);
delete pDbSource;

if(Id==AcDbObjectId::kNull)
return;

AcDbBlockTable *pBlkTbl;
pDbDest->getBlockTable(pBlkTbl, AcDb::kForRead);

AcDbBlockTableRecord *pmdl;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pmdl, AcDb::kForWrite);
pBlkTbl->close();

ads_point p;
int ret = acedGetPoint(NULL, _T("\nSpecify Point to Insert:"),p);
if(ret!=RTNORM) return;

AcGePoint3d Inspoint(p[X], p[Y], p[Z]);
AcDbBlockReference *pBlockobj = new AcDbBlockReference;

pBlockobj->setBlockTableRecord(Id);
pBlockobj->setPosition(Inspoint);
pmdl->appendAcDbEntity(pBlockobj);
pmdl->close();
pBlockobj->close();
}

static
AcDbObjectId getBlockId(AcDbDatabase *pSourceDb,
AcDbDatabase *pTargetDb,
ACHAR *sSourceBlock)
{
AcDbObjectId idBlock = AcDbObjectId::kNull;
if (AcDbSymbolUtilities::getBlockId(idBlock,sSourceBlock,pSourceDb)!=Acad::eOk)
{
return idBlock;
}

AcDbDatabase * pOutputDb = NULL;
if (pSourceDb->wblock(pOutputDb, idBlock)!=Acad::eOk)
{
delete pOutputDb;
return AcDbObjectId::kNull;
}

if (pTargetDb->insert(idBlock,sSourceBlock,pOutputDb,true)!=Acad::eOk)
{
delete pOutputDb;
return AcDbObjectId::kNull;
}
delete pOutputDb;

return idBlock;
}


ps: Tên bản vẽ lưu trong fName, ten Block lưu trong BlkName
tested trên ACAD 2010 (R18)
Goodluck!
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#66 vuxuanhuynh

vuxuanhuynh

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 22 November 2012 - 04:00 PM

Code của Detailing là Insert một Block có trong một bản vẽ khác vào bản vẽ Active;
Còn yêu cầu của mình là insert Block có tên là szBlock vào file với điều kiện
1. Kiểm tra nếu Block chưa có trong bản vẽ thì tiến hành chèn file szDwg=szBlock.dwg vào Database của Bản vẽ Active.
2. tiến hành chèn szBlock từ Database vào ModelSpace;
Đây là code mình đã sửa. Các bạn test thử nha:

void adskInsertBlock()
{
TCHAR *szBlock;
TCHAR *szDwg;
szBlock = _T("caycn");
szDwg =_T("C:\\Procad\\dwg\\caycn.dwg");
CheckBlock(szBlock,szDwg);
ads_point p1;
acedGetPoint(NULL,_T("chon diem chen"),p1);
AcGePoint3d Inspoint(p1[X],p1[Y],p1[Z]);
AcDbBlockTable *pBlkTable=NULL;
AcDbBlockTableRecord *pBlkTablerec;
AcDbDatabase *pCurDb = NULL;
AcGeScale3d Tile(1,1,1);
pCurDb = acdbHostApplicationServices()->workingDatabase();
pCurDb ->getSymbolTable(pBlkTable,AcDb::kForRead);
AcDbObjectId BlkId;
pBlkTable ->getAt(szBlock,BlkId);
if(pBlkTable->has(szBlock))
{
AcDbBlockReference *pBlockobj = new AcDbBlockReference;
pBlockobj ->setBlockTableRecord(BlkId);
pBlockobj ->setPosition(Inspoint);
pBlockobj ->setScaleFactors(Tile);
pBlkTable ->getAt(ACDB_MODEL_SPACE,pBlkTablerec,AcDb::kForWrite);
pBlkTable ->close();
pBlkTablerec ->appendAcDbEntity(pBlockobj);
pBlkTablerec ->close();
pBlockobj ->close();
acutPrintf("\nDa chen Block vao ban ve");
}

}
/* Ham kiem tra xem Block da co trong ban ve chua?
Neu chua co thi chen trong file vao*/

void CheckBlock( TCHAR *szBlock, TCHAR *szDwg)
{
AcDbDatabase *pBlockDb=NULL;
AcDbObjectId pBlockId;
AcDbDatabase *pDb=NULL;

pDb = acdbHostApplicationServices()->workingDatabase();



if ( CheckBlockExist( szBlock ))
{
return;
}
pBlockDb = new AcDbDatabase( Adesk::kFalse );
if ( pBlockDb->readDwgFile(szDwg) != Acad::eOk )
{
delete pBlockDb;
return;
}


pDb->insert( pBlockId, szBlock, pBlockDb );
delete pBlockDb;
//delete pDb;
return;
}

//------------------------------------//
// Kiem tra Block co ton tai khong //
//------------------------------------//
int CheckBlockExist( TCHAR *szBlock )
{
AcDbBlockTable *pBlockTable;
AcDbBlockTableRecord *pBlockTableRecord;
int nRet;
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
pDb->getBlockTable( pBlockTable, AcDb::kForRead );

// Get Pointer to This Blocks BlockTableRecord
nRet = pBlockTable->getAt( szBlock, pBlockTableRecord, AcDb::kForRead );
pBlockTable->close();

if ( nRet != Acad::eOk ) {
return( FALSE );
} else {
pBlockTableRecord->close();
return( TRUE );
}
}
  • 0

#67 vuxuanhuynh

vuxuanhuynh

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 22 November 2012 - 04:04 PM

Vấn đề đặt ra là nếu Block Attributes thì đoạn code trên cần bổ sung những gì để có thể chèn các Textstring cho Attributes. Detailing xem bổ sung cho mình với! Thanks
  • 0

#68 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 29 November 2012 - 03:09 PM

Không bạn nào tham gia cả :(

function Update Attribute cho Block

static
void UpdateAttribute(AcDbBlockReference *pBlkRef)
{
AcDbBlockTableRecord *pBlockDef;
acdbOpenObject(pBlockDef, pBlkRef->blockTableRecord(), AcDb::kForRead);

AcDbBlockTableRecordIterator *pIterator;
pBlockDef->newIterator(pIterator);
AcDbEntity *pEnt;
AcDbAttributeDefinition *pAttdef;
for (pIterator->start(); !pIterator->done();
pIterator->step())
{
pIterator->getEntity(pEnt, AcDb::kForRead);

pAttdef = AcDbAttributeDefinition::cast(pEnt);
if (pAttdef != NULL && !pAttdef->isConstant())
{
AcDbAttribute *pAtt = new AcDbAttribute();
pAtt->setPropertiesFrom(pAttdef);
pAtt->setInvisible(pAttdef->isInvisible());

AcGePoint3d basePoint = pAttdef->position();
basePoint += pBlkRef->position().asVector();
pAtt->setPosition(basePoint);
pAtt->setHeight(pAttdef->height());
pAtt->setRotation(pAttdef->rotation());
pAtt->setTag( pAttdef->tag());
pAtt->setTextString(_T("TEST ATT"));
AcDbObjectId attId;
pBlkRef->appendAttribute(attId, pAtt);
pAtt->close();
}
pEnt->close();
}
delete pIterator;
pBlockDef->close();
pBlkRef->close();
}


Thêm lời gọi hàm trong code trên

....................................

pmdl->appendAcDbEntity(pBlockobj);

UpdateAttribute(pBlockobj);

pmdl->close();
...........................................


Good luck!

p/s: Block insert cần có Att : tag = TAG
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#69 vuxuanhuynh

vuxuanhuynh

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 30 November 2012 - 08:18 PM

Mình cũng đã hoàn thành đoạn code này. các bạn text thử nhé.
Hàm này có kiểm tra xem Block có trong bản vẽ hay không? nếu có thì chèn luôn, nếu không có thì chèn theo file với đường dẫn cho trước.
/* Ham kiem tra xem Block da co trong ban ve chua?
Neu chua co thi chen trong file vao*/
void
ProcadUtil::CheckBlock(char *szBlock, char *szDwg)
{
AcDbDatabase *pBlockDb=NULL;
AcDbObjectId pBlockId;
AcDbDatabase *pDb=NULL;

pDb = acdbHostApplicationServices()->workingDatabase();

// If it Already Exists, Exit

if ( CheckBlockExist( szBlock ))
{
return;
}
pBlockDb = new AcDbDatabase( Adesk::kFalse );
if ( pBlockDb->readDwgFile(szDwg) != Acad::eOk )
{
delete pBlockDb;
return;
}

// Insert this new Drawing as a Block in the Current Database
pDb->insert( pBlockId, szBlock, pBlockDb );
delete pBlockDb;
//delete pDb;
return;
}

//------------------------------------//
// DoesBlockExist //
//------------------------------------//
int
ProcadUtil::CheckBlockExist( char *szBlock )
{
AcDbBlockTable *pBlockTable;
AcDbBlockTableRecord *pBlockTableRecord;
int nRet;
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
pDb->getBlockTable( pBlockTable, AcDb::kForRead );

// Get Pointer to This Blocks BlockTableRecord
nRet = pBlockTable->getAt( szBlock, pBlockTableRecord, AcDb::kForRead );
pBlockTable->close();

if ( nRet != Acad::eOk ) {
return( FALSE );
} else {
pBlockTableRecord->close();
return( TRUE );
}
}
void
ProcadUtil::InsertKH1(char *szBlock, char *szDwg, double x, double y, double elev,int stt, double Tile,double goc)
{
CheckBlock(szBlock,szDwg);
AcGePoint3d Inspoint(x,y,elev);
AcGePoint3d BasePoint;
AcGePoint3d BasePoint1;
AcDbBlockTable *pBlkTable=NULL;
AcDbBlockTableRecord *pBlkTablerec;
AcDbDatabase *pCurDb = NULL;
AcGeScale3d TileScale(Tile,Tile,Tile);
pCurDb = acdbHostApplicationServices()->workingDatabase();
pCurDb ->getSymbolTable(pBlkTable,AcDb::kForRead);
AcDbObjectId BlkId;
pBlkTable ->getAt(szBlock,BlkId);
if(pBlkTable->has(szBlock))
{
AcDbBlockReference *pBlockobj = new AcDbBlockReference;
pBlockobj ->setBlockTableRecord(BlkId);
/*struct resbuf to,from;
from.restype=RTSHORT;
from.resval.rint=1;
to.restype=RTSHORT;
to.resval.rint=0;
AcGeVector3d normal(0.0,0.0,1.0);
acedTrans(&(normal.x),&from,&to,Adesk::kTrue,&(normal.y));*/
pBlockobj ->setPosition(Inspoint);
pBlockobj ->setScaleFactors(Tile);
pBlkTable ->getAt(ACDB_MODEL_SPACE,pBlkTablerec,AcDb::kForWrite);
pBlkTable ->close();
AcDbObjectId pEntId;
pBlkTablerec ->appendAcDbEntity(pEntId,pBlockobj);
pBlkTablerec ->close();
// Open BlockRef do doc du lieu Attributes.
AcDbBlockTableRecord *pBlockDef;
acdbOpenObject(pBlockDef,BlkId,AcDb::kForRead);
//Cai dat 1 Block Table Record bien lap
// Duyet qua cac Attributes Definitions de kiem tra va gan du lieu
AcDbBlockTableRecordIterator *pItr;
pBlockDef->newIterator(pItr);
AcDbEntity *pEnt;
AcDbAttributeDefinition *pAttDef;
// Vong lap duyet qua cac pItr;
for (pItr->start(); !pItr->done();pItr->step())
{
// Get the next entity.
//
pItr->getEntity(pEnt,AcDb::kForRead);
// Kiem tra xem doi tuong co phai la Block Attributes khong?
//
pAttDef =AcDbAttributeDefinition::cast(pEnt);
if (pAttDef!=NULL)
{
char *pStr=pAttDef->tag();

if(_strcmpi(pStr,_T("TENDIEM"))==0)
{
AcDbAttribute *pAtt=new AcDbAttribute;
pAtt->setPropertiesFrom(pAttDef);
BasePoint =pAttDef->position();
BasePoint += pBlockobj->position().asVector();
pAtt->setPosition(BasePoint);
pAtt->setTag(pStr);
pAtt->setTextString("DC12");
pAtt->setHeight(pAttDef->height());
pAtt->setHorizontalMode(AcDb::TextHorzMode::kTextLeft);
pAtt->setVerticalMode(AcDb::TextVertMode::kTextBase);
//pAtt->setc
AcDbObjectId AttId;
pBlockobj->appendAttribute(AttId,pAtt);
pAtt->close();


}
if(_strcmpi(pStr,_T("DOCAO"))==0)
{
AcDbAttribute *pAtt1= new AcDbAttribute;
pAtt1->setPropertiesFrom(pAttDef);
BasePoint1 =pAttDef->position();
BasePoint1 += pBlockobj->position().asVector();
pAtt1->setPosition(BasePoint1);
//pAtt1->setPosition(pAttDef->position());
pAtt1->setTag(pStr);
pAtt1->setTextString("126.635");
pAtt1->setHeight(pAttDef->height());
pAtt1->setHorizontalMode(AcDb::TextHorzMode::kTextLeft);
pAtt1->setVerticalMode(AcDb::TextVertMode::kTextBase);
AcDbObjectId AttId1;
pBlockobj->appendAttribute(AttId1,pAtt1);
pAtt1->close();


}
free(pStr);

}
pEnt->close();
}
delete pItr;
pAttDef->close();

pBlockobj->close();

}
}
  • 1

#70 tiendung89

tiendung89

    biết lệnh move

  • Members
  • PipPipPip
  • 121 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 14 April 2014 - 02:43 AM

các anh trên diễn đàn cho e hỏi cách cài ARX Wizards.msi for arx2010 với ạ?


  • 0
Tôi không phải là đặc biệt, nhưng tôi là duy nhất ^^

#71 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 15 April 2014 - 01:33 PM

Bạn cần phải cài VS2008 SP1 chú ý cái SP1 trước sau đó cài ARX SDK tự nhiênn sẽ có ARX wizard trong VS

Goodluck ! :D


  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#72 tiendung89

tiendung89

    biết lệnh move

  • Members
  • PipPipPip
  • 121 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 16 April 2014 - 01:24 AM

Thank a Detailing. e đã cài được rùi

cho e hỏi thêm cái cách liên kết arx với cad với ạ(cụ thể từ bước thứ 12 trở đi). e làm như a Detailing nói nhưng đến bước thứ 13(đầu topic) thì cad lại không load được(chắc không đúng đường dẫn) :(

và cái code của arx trong VS2008 thì viết ở đoạn nào? e mới học cái này, cũng đang đọc tài liệu về nó

PS: e dùng VS2008 SP1 và autocad 2012


  • 0
Tôi không phải là đặc biệt, nhưng tôi là duy nhất ^^

#73 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 16 April 2014 - 10:34 AM

Thank a Detailing. e đã cài được rùi

cho e hỏi thêm cái cách liên kết arx với cad với ạ(cụ thể từ bước thứ 12 trở đi). e làm như a Detailing nói nhưng đến bước thứ 13(đầu topic) thì cad lại không load được(chắc không đúng đường dẫn) :(

và cái code của arx trong VS2008 thì viết ở đoạn nào? e mới học cái này, cũng đang đọc tài liệu về nó

PS: e dùng VS2008 SP1 và autocad 2012

Do AutoCAD 2012 được build bằng VS2010 nên mình nghĩ bạn nên sử dụng VS2010 và Object ARX 2012.

Đoạn code đó viết vào chỗ  ""Add your code for command ......"

Goodluck!


  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#74 tiendung89

tiendung89

    biết lệnh move

  • Members
  • PipPipPip
  • 121 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 16 April 2014 - 12:45 PM

cái code của .arx  phải Buil qua C sau mới dùng Lệnh ap của cad để load file .arx vào Cad

 vậy có cách khác để lúc ấn F5 thì tự ARX chạy sang Cad không ạ?

ví dụ như có 1 file hơi lớn 1 tí thì muốn View nó chạy như thế nào cũng phải Buil qua C,như vậy thì bất tiện quá.


  • 0
Tôi không phải là đặc biệt, nhưng tôi là duy nhất ^^

#75 codered8x

codered8x

    biết lệnh copy

  • Members
  • PipPipPip
  • 119 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 26 April 2014 - 11:21 PM

Bạn Detailing cho mình hỏi là giữa C#.Net, VB.Net và Object ARX thì nên chọn học thằng nào. Tại mình có đọc đâu đó một bài của bạn nói Object ARX tuy rằng mạnh nhất, được Autodesk dùng để phát triển cad nhưng lại khó sử dụng hơn .Net 

Thanks !


  • 0

#76 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 27 April 2014 - 02:03 PM

Bạn Detailing cho mình hỏi là giữa C#.Net, VB.Net và Object ARX thì nên chọn học thằng nào. Tại mình có đọc đâu đó một bài của bạn nói Object ARX tuy rằng mạnh nhất, được Autodesk dùng để phát triển cad nhưng lại khó sử dụng hơn .Net 

Thanks !

Chào bạn,

Mình cũng ko biết nên khuyên bạn chọn cái nào :D mình chỉ có thể góp vài ý kiến cá nhân dưới đây hy vọng giúp bạn có thể quyết định được nên chọn cái nào.

  • Nếu bạn chỉ muốn dừng ở mức cơ bản: tạo các command vẽ các entity, tính toán bình thường bạn có thể chọn C# hoặc VB .NET. Nếu bạn dùng C++ thì bạn phải tự khai báo các vùng nhớ và phải tự báo cho máy tính biết bạn đã dùng xong và trả lại cho window nếu ko sẽ ko có chương trình nào sử dụng dc các vùng nhớ đó (gọi là leak memory) -> hết bộ nhớ  :D, C# và VB ,NET có Garbage Collection làm giúp việc này rồi nên bạn ko cần quan tâm
  • Nếu bạn muốn tạo các chương trình hơi phức tạp một chút, sử dụng nhiều hàm hệ thống thì việc bạn tìm được 1 resource (code sample) viết bằng C# hay C++ sẽ dễ dàng hơn là VB .NET (mặc dù bạn có thể convert từ C# sang VB) lý do là những người lập trình chuyên nghiệp họ thường dùng C/C# hơn là VB. Ở mức này thì C++ có lợi thế hơn C# và VB .NET một chút do nó có thể tương tác dễ dàng hơn nhưng việc quản lý bộ nhớ thì cũng như trên, ở mức này thì khi dùng C# hay VB .NET đôi khi bạn phải sử dụng các com object để tương tác với AutoCAD. Đối với VB .NET thì các cú pháp (syntax) về event, delegate,... (VBA ko có cái này) nó hơi dài dòng và khó hiểu (ý kiến cá nhân). Ở mức độ này khi dùng C# hay VB .NET đôi khi bạn cũng cần phải yêu cầu Garbage Collection giải phóng bộ nhớ cho bạn ngay lập tức khi bạn vừa xài quá nhiều nên đôi khi bạn cũng cần quan tâm đến vấn đề này (bạn xem qua IDispose và Garbage Collection) nhưng cách thức thì dễ dàng hơn C++. Dĩ nhiên nếu bạn muốn tiến lên mức cao cấp thì giữa C# và VB .NET thì C# sẽ là 1 lưa chọn tốt vì syntax tương tự như C++.
  • Nếu bạn muốn kiểm soát hoàn toàn chương trình của mình, từ việc load đến việc đối tương của bạn thể hiện ra sao trên màn hình, khi in ra, khi copy, save như thế nào,... nghĩa là bạn đang cần tạo 1 loại đối tương cho riêng bạn thì C++ là lựa chọn duy nhất.

Đối với .NET thì ngoài việc ko cần quản lý bộ nhớ thì nó cũng có 1 điểm có lợi hơn C++ là: đây là ngôn ngữ mới và đang được MS phát triển và có rất nhiều thứ bạn chỉ cần vài dòng code là xong trong khi C++ có thể sẽ rất vất vả mà chưa chắc đạt được như mong muốn (chủ yếu ở phần giao diện)

Vài ý kiên cá nhân hy vọng giúp dc bạn.

Thân!


  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#77 codered8x

codered8x

    biết lệnh copy

  • Members
  • PipPipPip
  • 119 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 28 April 2014 - 12:48 AM

ok, cảm ơn Detailing nhiều. Mình cũng tham khảo nhiều ý kiến trên các forum nước ngoài, thấy họ cũng nói tương tự bạn : Với những cái cơ bản thì dùng C#.NET, VB.NET, còn Object ARX thì dùng cho nhiệm vụ có yêu cầu cao. Và giữa C# và VB thì nên chọn C# vì nó phổ biến hơn rất nhiều.


  • 0

#78 lenhatanh

lenhatanh

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 25 January 2015 - 09:45 PM

Hi Detailing !

mình đang học và thử build một file *.arx (dùng VS2005, CAD2007, ObjectARX 2007, 2006) nhưng khi build project thi bị lỗi như sau: ... cannot open file 'mfc70.lib'

Nhờ bạn chỉ cho mình cách khắc phục lỗi trên với. (mình đã tìm 'mfc70.lib' trên máy và trên "Google" nhưng không tìm thấy file mfc70.lib).


Bài viết đã được chỉnh sửa nội dung bởi lenhatanh: 25 January 2015 - 09:51 PM

  • 0

#79 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 26 January 2015 - 12:00 AM

mfc70.lib nằm trong bộ vc7.0 (hay còn gọi là vc.net hay vc2002), bộ này đã "mất gốc" rồi. Hồi trước mình có mua bộ này (5CD) nhưng đến nay đã hư, may mà đã cài trên winxp, sau đó lưu và giữ lại trên file ghost chứ mình vẫn chưa chuyển đc hoàn toàn code lên vc2005 (nó gây lỗi ở kiểu chuỗi do mình kết hợp với Delphi). Mình định tìm mua lại bộ này nhưng chưa đc. Nếu bạn mới làm thì nên dùng vc2005 với cad2007 và arx2007, đừng dùng cad và arx2006 nữa.
  • 0

#80 lenhatanh

lenhatanh

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 08 May 2016 - 09:23 PM

Chào mọi người !

Mình sử dụng Visual Studio 2005 làm thử ArxProject.arx

vẽ đường tròn như hướng dẫn ở trang 1 nhưng khi Build thì bị lỗi.

Nhờ mọi người xem và sửa giúp các lỗi nhé.

Xin cảm ơn.

Link Project:

http://www.mediafire.../ArxProject.rar


  • 0