/* FAN (C) Copyright 2012 Källkoderna tillhör IDC (Industrial Development Center i USA) och Evelina Rockefeller Dom är författad av Bengt-Olof Drugge och är sensat ändrad 2012-07-09 kl 18.00 Det här programmet är AutCADs del i ett expertsystem för att bygga optimala fläktar Jag kallar mitt expert system för FANnik och rätten till det expert systemet ägs av IDC och jag som jobbar för IDC ger källkoderna till IDC och Evelina Rockefeller som chefs ingenjör på IDC eller (Industrial Development Center i USA). Bengt-Olof Drugge */ #include #include #include #include #include #include #include #include #include #include #include #define fcount 6 #define err 1e-5 #define err2 1e-10 #define ELEMENTS(array) (sizeof(array)/sizeof((array)[0])) static double pi = 3.141592653589793; static int loadfuncs(); ads_point ptup1[15001],ptdw1[15001],ptup2[15001],ptdw2[15001]; int spiral(); int hus(); int inlp(); int hus1(); int prop1(); int funcload(); int funcunload(); int fan1(); int fnik(); int hol(ads_name ent1,ads_name ent2); void cross(); void subb(); void add(); void trans(); void midp(); void trim(int n1, int n2); /**************************************************************************/ /* ADS Function Table */ typedef struct { char *name; int (*fptr)(); } ftblent; /* Table of ADS functions */ ftblent ftable[] = { { "C:3DSPIRAL", spiral}, { "C:FANHOUSE", hus1}, { "C:FAN", fan1}, { "C:PROP", prop1}, { "C:FANNIK", fnik}, }; int funcload() { int i; for (i = 0; i < ELEMENTS(ftable); i++) { if (!ads_defun(ftable[i].name, i)) return RTERROR; /*ds_regfunc(ftable[i].fptr,i);*/ } return RTNORM; } int funcunload() { int i; /* Undefine each function we defined */ for (i = 0; i < ELEMENTS(ftable); i++) { ads_undef(ftable[i].name,i); } return RTNORM; } int dofun() { int val; int rc; if ((val = ads_getfuncode()) < 0 || val > ELEMENTS(ftable)) return RTERROR; rc = (*ftable[val].fptr)(); return ((rc == RTNORM) ? RSRSLT:RSERR); } extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* ptr) { if (ptr != NULL) { // We have been handed some kind of object // but we aren't going to do anything with it. } switch(msg) { case AcRx::kInitAppMsg: acrxUnlockApplication(ptr); acrxRegisterAppMDIAware(ptr); break; case AcRx::kInvkSubrMsg: dofun(); break; case AcRx::kLoadADSMsg: { funcload(); ads_printf("\nFAN by B.O Drugge (C) Copyright 2012\n"); } break; case AcRx::kUnloadADSMsg: funcunload(); ads_printf("Unloading.\n"); break; case AcRx::kUnloadAppMsg: default: break; } return AcRx::kRetOK; } ads_real dabs(ads_real a) {return sqrt(a*a);} void cross (ads_point v,ads_point w,ads_point n) { n[X]=v[Y]*w[Z]-v[Z]*w[Y]; n[Y]=v[Z]*w[X]-v[X]*w[Z]; n[Z]=v[X]*w[Y]-v[Y]*w[X]; } void subb (ads_point v,ads_point w,ads_point n) { n[X]=v[X]-w[X]; n[Y]=v[Y]-w[Y]; n[Z]=v[Z]-w[Z]; } void add (ads_point v,ads_point w,ads_point n) { n[X]=v[X]+w[X]; n[Y]=v[Y]+w[Y]; n[Z]=v[Z]+w[Z]; } ads_real dotprod(ads_point v,ads_point w) { ads_real back; back = v[X]*w[X]+v[Y]*w[Y]+v[Z]*w[Z]; return back; } ads_real dabsprod(ads_point v,ads_point w) { ads_real back; back=sqrt(v[X]*v[X]+v[Y]*v[Y]+v[Z]*v[Z])*sqrt(w[X]*w[X]+w[Y]*w[Y]+w[Z]*w[Z]); return back; } ads_real angle(ads_point v,ads_point w) { ads_real back; back = acos((dotprod(v,w)/dabsprod(v,w))); return back; } void trans (ads_point p1,ads_point p2,ads_real a1,ads_real a2) { ads_real v,u,l1; u=atan(p1[Y]/(p1[X]+err2)); v=atan(p1[Z]/(sqrt(p1[X]*p1[X]+p1[Y]*p1[Y])+err2)); if (p1[X]<0) a1=a1+pi; a1=a1+u; a2=a2+v; l1=sqrt(p1[X]*p1[X]+p1[Y]*p1[Y]+p1[Z]*p1[Z]); p2[X]=l1*cos(a1)*cos(a2); p2[Y]=l1*sin(a1)*cos(a2); p2[Z]=l1*sin(a2); } int spiral() { ads_point pins,pt,result; ads_real r1,r2,h,dr,dh,k1,k2; struct resbuf *ebuf,rb,fromrb,torb; int i1,n,test; ads_getvar("SURFTAB1",&rb); n=rb.resval.rint; fromrb.restype = RTSHORT; fromrb.resval.rint = 0; torb.restype = RTSHORT; torb.resval.rint = 1; ads_initget(5,NULL); test=ads_getdist(NULL,"\nEnter radius1:",&r1); if (test == RTCAN) return RTNORM; ads_initget(5,NULL); test=ads_getdist(NULL,"\nEnter radius2:",&r2); if (test == RTCAN) return RTNORM; ads_initget(5,NULL); test=ads_getdist(NULL,"\nEnter hight of spiral:",&h); if (test == RTCAN) return RTNORM; test=ads_getpoint(NULL,"\nEnter insertion point:",pins); if (test == RTCAN) return RTNORM; k2=2*pi/n; dr=(r2-r1)/n; dh=h/n; ebuf=ads_buildlist(RTDXF0,"POLYLINE",66,1,70,8,NULL); ads_entmake(ebuf); k1=0; n++; for (i1=0;i1:",&dens); if (test == RTCAN) return RTNORM; stodola=1.0; ads_initget(4,NULL); test=ads_getreal("\nStodola coef <1.0>:",&stodola); if (test == RTCAN) return RTNORM; ads_initget(5,NULL); test=ads_getint("\nNumber of wings (st):",&nv); if (test == RTCAN) return RTNORM; n=0.0; ads_initget(4,NULL); test=ads_getreal("\nRotating speed (rpm):",&n); if (test == RTCAN) return RTNORM; if (n>0) { ads_initget(4,NULL); test=ads_getreal("\nInlet speed (m/s):",&vi); if (test == RTCAN) return RTNORM; } if (n == 0.0) { ads_initget(5,NULL); test=ads_getdist(NULL,"\nInlet diameter (mm):",&di); if (test == RTCAN) return RTNORM; ads_initget(5,NULL); test=ads_getdist(NULL,"\nOutlet diameter (mm):",&dy); if (test == RTCAN) return RTNORM; } test=ads_getpoint(NULL,"\nInsertion point:",pins); if (test == RTCAN) return RTNORM; if (n > 0.0) { r1=sqrt(flow/(vi*pi)); w=2*pi*n/60; r2=r1; u1=w*r1; dp=0.0; while (dp < 2*press) { beta2=atan(2*vi/(w*r2)); /*kslip=1/(1+1.5/nv*(1+beta2/(pi/3.0))/(1-r1*r1/(r2*r2)));*/ u2=w*r2; dp=(u2*u2*(1-stodola*pi*sin(beta2)/nv)-u1*u1)*dens; r2=r2+.000001; } } if (n == 0) { r1=di/2000; r2=dy/2000; vi=flow/(r1*r1*pi); dp=0.0; w=2*pi/60; while (dp < 2*press) { beta2=atan(2*vi/(w*r2)); /*kslip=1/(1+1.5/nv*(1+beta2/(pi/3.0))/(1-di*di/(dy*dy)));*/ dp=((w*r2)*(w*r2)*(1-stodola*pi*sin(beta2)/nv)-(w*r1)*(w*r1))*dens; w=w+2*pi/60000; } } beta1=atan(2*vi/(w*r1)); h1=r1*r1/(2*r1); h2=r1*r1/(2*r2); alpha1=r1/(2*vi)*w; alpha2=r2/(2*vi)*w; dalp=(alpha2-alpha1)/sf1; if ((2*vi/(w*r1))>1.0) ads_printf("\nWARNING !!! Inlet blade angle greater than 45 degrees"); ads_printf("\nInlett blade angle:%f\nOutlet blade angle:%f",beta1*180/pi,beta2*180/pi); for (i2=0;i2resval.rstring,"r")); for (i=0; i<26; i++) /*26 anger antal siffror i fan filen ökar du den siffran så ökar du antalet slitsar, om du vill ha 20 slitsar så blir talet 58*/ fscanf(fp,"%f",&lres[i]); surf=lres[13]; ads_command(RTSTR,"SURFTAB1",RTSHORT,surf,NULL); ads_getvar("SURFTAB1",&rb); sf1=rb.resval.rint; ads_getvar("SURFTAB2",&rb); sf2=rb.resval.rint; fromrb.restype = RTSHORT; fromrb.resval.rint = 0; torb.restype = RTSHORT; torb.resval.rint = 1; flow=lres[2]/2.0; dens=lres[4]; stodola=lres[6]; nv=lres[5]; di=lres[0]; dy=lres[1]; test=ads_getpoint(NULL,"\nInsertion point:",pins); if (test == RTCAN) return RTNORM; r1=di/2000; r2=dy/2000; vi=flow/(r1*r1*pi); w=2*pi*lres[3]/60; beta1=atan(2*vi/(w*r1)); h1=r1*r1/(2*r1); h2=r1*r1/(2*r2); alpha1=r1/(2*vi)*w; alpha2=r2/(2*vi)*w; dalp=(alpha2-alpha1)/sf1; for (i2=0;i2-1 ;i1--) { kslip=(rr1[i]+(rr1[i+1]-rr1[i])/sf1*i1); pt[X]=kslip*cos(k1)*1000.0; pt[Y]=kslip*sin(k1)*1000.0; pt[Z]=0.0; kslip=(rr1[i]+(rr1[i+1]-rr1[i])/sf1*(i1-1)); p1[X]=kslip*cos(k1+dalp)*1000.0; p1[Y]=kslip*sin(k1+dalp)*1000.0; p1[Z]=0.0; p2[X]=p1[X]; p2[Y]=p1[Y]; p2[Z]=100.0; subb(p2,pt,p3); subb (p1,pt,p4); cross (p3,p4,p1); p2[X]=0.0; p2[Y]=0.0; p2[Z]=0.0; l1=ads_distance(p1,p2); p1[X]=p1[X]/l1*lres[15]/2.0; p1[Y]=p1[Y]/l1*lres[15]/2.0; p1[Z]=0.0; add(p1,pt,p2); add(p2,pins,pt); ptdw1[test+sf1-i1][X]=pt[X]; ptdw1[test+sf1-i1][Y]=pt[Y]; ptdw1[test+sf1-i1][Z]=lres[0]; ads_trans(pt,&torb,&fromrb,0,result); ebuf=ads_buildlist(RTDXF0,"VERTEX",10,result,NULL); ads_entmake(ebuf); k1=k1+dalp; } ebuf=ads_buildlist(RTDXF0,"SEQEND",NULL); ads_entmake(ebuf); for (i1=0; i10) && (t<1)) { pt[X]=pt[X]*t+bl[X]; pt[Y]=pt[Y]*t+bl[Y]; pt[Z]=pt[Z]*t+bl[Z]; alpha = angle(ap,bp); alpha1= angle(ap,pt); alpha2= angle(bp,pt); if ( (dabs(pt[X])0) && (t<1)) { pt[X]=pt[X]*t+bl[X]; pt[Y]=pt[Y]*t+bl[Y]; pt[Z]=pt[Z]*t+bl[Z]; alpha = angle(ap,bp); alpha1= angle(ap,pt); alpha2= angle(bp,pt); if ( (dabs(pt[X])