📄 mkpwx.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 + -