⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkpwx.cpp

📁 在AUTOCAD环境下
💻 CPP
字号:

#include <string.h>
#include <aced.h>
#include <dbents.h>
#include <dbsymtb.h>
#include <dbgroup.h>
#include <adslib.h>

#include <math.h>
#define PI 3.141592653589793
#define Spoint(pt, x, y, z)  pt[0] = (x);  pt[1] = (y);  pt[2] = (z)//付值点
#define Cpoint(d, s)   d[0] = s[0];  d[1] = s[1];  d[2] = s[2]		//点复制
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define CMD_off  {struct resbuf rBc;\
	ads_getvar("CMDECHO", &rBc);\
	rBc.resval.rint = (int) false;\
	ads_setvar("CMDECHO", &rBc);} 
#define CMD_on  {struct resbuf rBcc;\
	ads_getvar("CMDECHO", &rBcc);\
	rBcc.resval.rint = (int) true;\
	ads_setvar("CMDECHO", &rBcc);} 

void runIt();


void DrC(ads_point pt,double r,int color)
{
	ads_point pt1,pt2;
	double i;
	for (i = 0.0;i < 2 * PI + 0.0001;i+=(0.3))
	{
		ads_polar(pt,i,r,pt1);
		
		if (i > 0.0) ads_grdraw(pt1,pt2,color,0);
		Cpoint(pt2,pt1);
	}
}


double GetH()
{
	double screen_h;
	struct resbuf rb;
	ads_getvar("VIEWSIZE", &rb);
	screen_h=rb.resval.rreal / 7;
	return screen_h;
}






//换点
void JHD(ads_point &pt1,ads_point &pt2)
{
	ads_point temp;
	Cpoint(temp,pt1);
	Cpoint(pt1,pt2);
	Cpoint(pt2,temp);
}

//===========坐标转换===========
BOOL CoorSwitch(ads_point OriginBefor,ads_point OriginBehind,double angle,ads_point pt,ads_point &rpt)
{
	double rC,tempAngle;
	rC = ads_distance(OriginBefor,pt);
	tempAngle = ads_angle(OriginBefor,pt);
	ads_polar(OriginBehind,angle+tempAngle,rC,rpt);
	return 1;
}
//========================================================
//根据直线上某点做与直线成一定夹角定长的线段的函数(函数说明:
//pt1,pt2为直线上的两点,dist为距pt1点的距离,bz=1为在直线的
//右侧=-1为在直线的左侧,,PerAngle为与直线的角度,PerLong为
//线段的长度)
BOOL GetPerLine(ads_point pt1,ads_point pt2,double dist,
				int bz, double PerAngle,double PerLong,ads_point &rePoint,ads_point &Origin)
{
	int ttt = 1;
	double rAngle;
	rAngle = ads_angle(pt1,pt2);
	Origin[0] = pt1[0] + cos(rAngle) * dist;
	Origin[1] = pt1[1] + sin(rAngle) * dist;
	ads_polar(Origin,rAngle - bz * PerAngle,PerLong,rePoint);
	return 1;	
}
AcDbObjectId DrCircle(ads_point pt,double r,int col)
{
	AcGePoint3d center(pt[0],pt[1],0.0);
	AcGeVector3d normal(0.0,0.0,1.0);
	AcDbCircle *pCirc = new AcDbCircle(center,normal,r);
	AcDbBlockTable *pBlockTable;
    acdbCurDwg()->getBlockTable(pBlockTable,
        AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
   	pBlockTable->close();
    AcDbObjectId circleId;
	pBlockTableRecord->appendAcDbEntity(circleId, pCirc);
	pCirc->setColorIndex(col);
	pBlockTableRecord->close();
	pCirc->close();
    return circleId;
}
//---画Pline线函数---//
//n为点的个数,LAY为层名,PT[]为各点的坐标,LX[]曲率,WID线宽,COL颜色
int MakePline(int n,ads_point pt[])
{
	 int i,status;
	 struct resbuf *eb;
	 eb=ads_buildlist(RTDXF0,"POLYLINE",62,1,66,1,70,0,NULL);
	 status=ads_entmake(eb);
	 if(status==RTERROR||status==RTCAN ||ads_relrb(eb)!=RTNORM)	return RTERROR;
	 for(i=0;i<n;i++)
	 {
	  eb=ads_buildlist(RTDXF0,"VERTEX",10,pt[i],40,0.0,41,0.0,62,1,NULL);
	 if(!eb) return RTERROR;
	 status=ads_entmake(eb);
	 if(status==RTERROR||status==RTCAN||ads_relrb(eb)!=RTNORM)	return RTERROR;
	}
	eb=ads_buildlist(RTDXF0,"SEQEND",NULL);
	if(!eb)	return RTERROR;
	 status=ads_entmake(eb);
	 if(status==RTERROR||status==RTCAN||ads_relrb(eb)!=RTNORM)	return RTERROR;
	 return RTNORM;
}


void temFix(ads_point pt,double angle,int color)
{

	ads_point pt1,pt2,pt3,pt4,tem;
	double l;
	l = GetH();
	ads_polar(pt,angle,l,pt1);
	ads_polar(pt,angle + PI / 2,l,pt2);

	GetPerLine(pt1,pt,0,1,PI/7.0,l/4.0,pt3,tem);
	GetPerLine(pt1,pt,0,-1,PI/7.0,l/4.0,pt4,tem);
	ads_grdraw(pt,pt1,color,0);
	ads_grdraw(pt1,pt3,color,0);
	ads_grdraw(pt1,pt4,color,0);

	GetPerLine(pt2,pt,0,1,PI/7.0,l/4.0,pt3,tem);
	GetPerLine(pt2,pt,0,-1,PI/7.0,l/4.0,pt4,tem);
	ads_grdraw(pt,pt2,color,0);
	ads_grdraw(pt2,pt3,color,0);
	ads_grdraw(pt2,pt4,color,0);
	DrC(pt,l / 7.0,color);
}


//抛物线内插
double Pwcz(double x0,double y0,double x1,double y1,
				double x2,double y2,double x)
{
	double rPwczY;
	rPwczY = ((x - x1) * (x - x2)) / ((x0 - x1) * (x0 - x2)) * y0 +
		((x - x0) * (x - x2)) / ((x1 - x0) * (x1 - x2)) * y1 +
		((x - x0) * (x - x1)) / ((x2 - x0) * (x2 - x1)) * y2;
	return rPwczY;
}


void DrawPWX(ads_point pt1,ads_point pt2,ads_point pt3,int no,
		ads_point ptx1,ads_point ptx2,BOOL drc,BOOL draw,double r)
{
	int n,t;
	double i,j;
	ads_point pt[200],temp;
	if (pt1[0] > pt2[0]) {
		Cpoint(temp,pt1);
		Cpoint(pt1,pt2);Cpoint(pt2,temp);
	}
	if (pt1[0] == pt2[0] || pt1[0] == pt3[0] ||
		pt2[0] ==pt3[0]){
		return;
	}
	for (i = (pt3[0] < pt1[0] ? pt3[0] : pt1[0]),n = 0;i < (pt2[0] > pt3[0] ? 
		pt2[0] : pt3[0]) + 0.01;i += ((pt2[0] - pt1[0]) / (no - 1)),n++) 
	{
		j = Pwcz(pt1[0],pt1[1],pt2[0],pt2[1],pt3[0],pt3[1],i);
		Spoint(pt[n],i,j,0.0);
		if (drc && draw) DrCircle(pt[n],r,2);
	}
	if (draw) MakePline(n,pt);

	else {
		for (t = 0;t < n;t++) {
			if (t < n - 1) 
				ads_grdraw(pt[t],pt[t + 1],-1,0);
		}
	}
}


void runIt()
{
	int type,nomber,kfx,bzy;
	struct resbuf rb;
	double MidR;
	BOOL drc;
	drc = false;MidR = 1.0;bzy = 0;nomber = 20;
	ads_point pt1,pt2,pt3;
	ads_printf("绘制抛物线函数  (@Copying Right By KongFanXing   2002/04/07)\n");
	if (ads_getint("请输入将要拟合成PolyLine线顶点的个数:<默认20>",&nomber)!=RTNORM)
	{
	//	ads_printf ("非法输入!");
	//	return;
	}

	ads_getint("\n在PolyLine各顶点处绘制小圆: <1_是>/<0_否>:默认<0_否>",&bzy);
    if(bzy == 1) {
		if (ads_getreal("\n请输入将要插入小圆的半径:<1.0>",&MidR)!=RTNORM)
		{
		//	ads_printf ("非法输入!");
		//	return;
		}
		drc = true;
	}

	if (ads_getpoint(NULL,"\n输入第一点:",pt1)!=RTNORM)
	{
		ads_printf ("非法输入!");
		return ;
	}
	if (ads_getpoint(pt1,"\n输入第二点:",pt2)!=RTNORM) 
	{
		ads_printf ("非法输入!");
		return ;
	}
	kfx = 1;
	for(;;){
		if (kfx) { 
			ads_printf("\n拖动第三点位置:<空格或其它键定点>");
			kfx = 0;
		}
		ads_grread(3,&type,&rb); //读取用户输入信息
		if( rb.resval.rint == RTCAN )break;    //esc key
		if(type==6||type==11 || rb.resval.rint == 100) {
			ads_printf("*取消*");break;}
		if(type==3) {   //当用户按下左键
			DrawPWX(pt1,pt2,pt3,nomber,pt1,pt2,drc,true,MidR);
			break;
		}
		if(type==2) {	//当用户按下键盘
			CMD_off;ads_command(RTSTR,"redraw",NULL);CMD_on;
			DrC(pt1,GetH() / 5.0,1);
			DrC(pt2,GetH() / 5.0,1);
			if (ads_getpoint(NULL,"\n输入第三点:",pt3)!=RTNORM) return ;
			DrawPWX(pt1,pt2,pt3,nomber,pt1,pt2,drc,true,MidR);
			break;
		}
		if(type==5) {	//鼠标拖动
			CMD_off;ads_command(RTSTR,"redraw",NULL);CMD_on;
			Cpoint(pt3,rb.resval.rpoint);
			DrawPWX(pt1,pt2,pt3,20,pt1,pt2,drc,false,MidR);
			temFix(rb.resval.rpoint,0,2);
		}
	}
	CMD_off;ads_command(RTSTR,"redraw",NULL);CMD_on;
}

void initApp()
{
    acedRegCmds->addCommand("FanXing","MKPWX","MKPWX",
		ACRX_CMD_MODAL,runIt);
}

void unloadApp()
{
        acedRegCmds->removeGroup("FanXing");
}

extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
        switch (msg) {
        case AcRx::kInitAppMsg:
        acrxDynamicLinker->unlockApplication(pkt);
                initApp();
                break;
        case AcRx::kUnloadAppMsg:
                unloadApp();
        }
        return AcRx::kRetOK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -