PROCEDURE Bresler;
{DEBUG}
LABEL
1,2,3,4;
CONST
inc=60;
VAR
coor:ARRAY[1..100,1..2] OF REAL;
area1:ARRAY[1..100] OF REAL;
area:ARRAY[1..100] OF REAL;
varilla:ARRAY[1..100,1..2] OF REAL;
b,h,rec,fpc,fy,lon,est,ec,e0,dif,dif1,bb,hh,ca,cl:REAL;
agr,pu,mux,muy,vu,vux,vuy,pres,eresx,eresy:REAL;
por,prjar,comp,prbe,prbs,mrx,mry,err,sepc:REAL;
x,y,vari,diamp,dp,s,FR,amax,amin,areat,ex,ey:REAL;
fac,fbc,bp,hp,ang,ceo,puc,exc,eyc:REAL;
po,ib1,ib2,ib3,ih1,ih2,ih3,exr,eyr,pr0,prx,pry,mxcen,mycen,ed:REAL;
p,fact,Vulim,VcRlim,s0,s1,s2,s3,s4,has,cte,VcR,Av:REAL;
i,ii,jj,k,nv,KCode,xy:INTEGER;
ductil,nombre,letrero,layername,sep:STRING;
j:BOOLEAN;
ObjectHd:HANDLE;
areasec,pr,ce,dia,exy,exyc,c1,c2,c3,a:REAL;
mxy,t,Ac,yc,dis,esi,long,fu,fs,alfa,eyi,areac:REAL;
colorIndex:LONGINT;
{$INCLUDE FechaGenesis.txt}
Procedure Texto(nombre:STRING;pos:INTEGER;VAR dato:STRING);
VAR
layername:STRING;
ObjectHd:HANDLE;
BEGIN
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);
layername:=Copy(layername,pos,1);
ObjectHd:=GetObject(Concat(nombre,layername));
dato:=GetText(ObjectHd);
END;
Procedure Numero(nombre:STRING;pos:INTEGER;VAR dato:REAL);
VAR
layername:STRING;
ObjectHd:HANDLE;
BEGIN
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);
layername:=Copy(layername,pos,1);
ObjectHd:=GetObject(Concat(nombre,layername));
dato:=Str2Num(GetText(ObjectHd));
END;
Procedure Poner(nombre,dato:STRING;pos:INTEGER);
VAR
layername:STRING;
ObjectHd:HANDLE;
BEGIN
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);
layername:=Copy(layername,pos,1);
ObjectHd:=GetObject(Concat(nombre,layername));
SetText(ObjectHd,dato);
END;
{Subprograma para calcular los volúmenes de esfuerzos del concreto, momentos y centros de gravedad}
Procedure vol(bp,hp,fbc,ec,e0:REAL;VAR v,mx,my,x,y:REAL);
BEGIN
v:=fbc*bp*hp*ec/e0*(1/3-ec/e0/12);
mx:=fbc*bp*hp^2*ec/e0*(1/12-1/60*ec/e0);
my:=fbc*bp^2*hp*ec/e0*(1/12-1/60*ec/e0);
x:=my/v;
y:=mx/v;
END;
{Subprograma para calcular la fuerza, del concreto, del acero y los momentos producidos por éstas para secciones rectangulares}
Procedure fuerzas;
VAR
vI,mxI,myI,mxII,myII:REAL;
vIIA,mxIIA,myIIA,vIIB,mxIIB,myIIB,mxIII,myIII,mxIV,myIV:REAL;
xIIA,yIIA,xIIB,yIIB,xC,yC,bp1,hp1:REAL;
vC,mxC,myC,mxy,eys,dis,es:REAL;
esi,fs,cc,e,fu,ey,xxx,long:REAL;
KCode,i:INTEGER;
nombre,caso:STRING;
BEGIN
long:=hp*Sin(Arctan(bp/hp));
puc:=0;
mxcen:=0;
mycen:=0;
eys:=fy/2100000;
FOR i:=1 TO nv DO BEGIN
dis:=-(hp*coor[i,1]+bp*coor[i,2]-bp*hp)/sqrt(hp^2+bp^2);
esi:=ec*dis/long;
IF esi>=eys THEN fs:=fy;
IF ((esi<eys) AND (esi>(-eys))) THEN fs:=esi*2100000;
IF esi<=(-eys) THEN fs:=-fy;
fu:=area[i]*fs;
puc:=puc+fu;
mxcen:=mxcen+fu*(h/2-coor[i,2]);
mycen:=mycen+fu*(b/2-coor[i,1]);
END;
xxx:=bp/hp*(hp-h);
{ Caso I}
IF ((bp<=b) AND (hp<=h)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,cc,mxI,myI,x,y);
END
{ Caso IIA}
ELSE IF ((bp>b) AND (hp<=h)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp-b;
hp1:=hp/bp*(bp-b);
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIA,mxIIA,myIIA,xIIA,yIIA);
myIIA:=vIIA*(b+xIIA);
cc:=vI-vIIA;
mxII:=mxI-mxIIA;
myII:=myI-myIIA;
x:=myII/cc;
y:=mxII/cc;
END
{* Caso IIB}
ELSE IF ((bp<=b) AND (hp>h)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp/hp*(hp-h);
hp1:=hp-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIB,mxIIB,myIIB,xIIB,yIIB);
mxIIB:=vIIB*(h+yIIB);
cc:=vI-vIIB;
mxII:=mxI-mxIIB;
myII:=myI-myIIB;
x:=myII/cc;
y:=mxII/cc;
END
{* Caso III}
ELSE IF ((bp>b) AND (hp>h) AND (xxx<=b)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp-b;
hp1:=hp/bp*(bp-b);
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIA,mxIIA,myIIA,xIIA,yIIA);
myIIA:=vIIA*(b+xIIA);
bp1:=bp/hp*(hp-h);
hp1:=hp-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIB,mxIIB,myIIB,xIIB,yIIB);
mxIIB:=vIIB*(h+yIIB);
cc:=vI-vIIA-vIIB;
mxIII:=mxI-mxIIA-mxIIB;
myIII:=myI-myIIA-myIIB;
x:=myIII/cc;
y:=mxIII/cc;
END
{ Caso IV}
ELSE BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp-b;
hp1:=hp/bp*(bp-b);
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIA,mxIIA,myIIA,xIIA,yIIA);
myIIA:=vIIA*(b+xIIA);
bp1:=bp/hp*(hp-h);
hp1:=hp-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIB,mxIIB,myIIB,xIIB,yIIB);
mxIIB:=vIIB*(h+yIIB);
bp1:=bp/hp*(hp-h)-b;
hp1:=hp/bp*(bp-b)-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vC,mxC,myC,xC,yC);
mxC:=vC*(h+yC);
myC:=vC*(b+xC);
cc:=vI-vIIA-vIIB+vC;
mxIV:=mxI-mxIIA-mxIIB+mxC;
myIV:=myI-myIIA-myIIB+myC;
x:=myIV/cc;
y:=mxIV/cc;
END;
puc:=FR*(puc+cc);
mycen:=FR*(mycen+cc*(h/2-y));
mxcen:=FR*(mxcen+cc*(b/2-x));
exc:=mycen/puc;
eyc:=mxcen/puc;
END;
{Subprograma para calcular la resistencia de una columna
por el metodo de la fórmula inversa de Boris Bresler,
utilizando un método simplificado.}
Procedure Boris;
VAR
m,k1,dif,c,fue,cinc,ei,e,f:REAL;
BEGIN
k1:=0.85*fbc*bb;
dif:=1000;
c:=0;
cinc:=2*hh/100;
FOR ii:=1 TO 100 DO BEGIN
c:=c+cinc;
fue:=0;
m:=0;
e:=fy/2100000;
{Contribución del acero}
FOR jj:=1 TO nv DO BEGIN
ei:=0.003*(c-coor[jj,xy])/c;
IF abs(ei)>=e THEN
f:=area[i]*fy*abs(ei)/ei
ELSE
f:=area[i]*ei*2100000;
fue:=fue+f;
m:=m+(hh/2.-coor[jj,xy])*f;
END;
{Contribución del concreto}
IF c>hh THEN BEGIN
fue:=fue+k1*hh;
m:=m+0.1*k1*hh**2;
END
ELSE BEGIN
fue:=fue+k1*c;
m:=m+k1*c*(hh/2-0.4*c);
END;
exc:=m/fue;
dif1:=abs(ed-exc);
IF (dif1<dif) THEN BEGIN
dif:=dif1;
puc:=fue;
END;
END;
END;
BEGIN
SetCursor(WatchC);
Message('Revisando los datos...');
{************* Revisión de la información ***************}
SetConstrain('qsw');
SetTool(2);
PushAttrs;
DSelectAll;
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);
IF ((layername='Columna C-1') OR (layername='Columna C-2') OR (layername='Columna C-3') OR
(layername='Columna C-4') OR (layername='Columna C-5')) THEN BEGIN
Numero('fpc',11,fpc);
Numero('fy',11,fy);
Numero('rec',11,rec);
Numero('lon',11,lon);
Numero('rec',11,rec);
Numero('lon',11,lon);
Numero('est',11,est);
Numero('agr',11,agr);
Numero('pu',11,pu);
Numero('mux',11,mux);
Numero('muy',11,muy);
Numero('vux',11,vux);
Numero('vuy',11,vuy);
Numero('cal',11,cl);
Texto('ductil',11,ductil);
Texto('sep',11,sep);
Poner('por','****',11);
Poner('as','****',11);
Poner('prjar','****',11);
Poner('comp','****',11);
Poner('prbe','****',11);
Poner('prbs','****',11);
Poner('mrx','****',11);
Poner('mry','****',11);
Poner('err','****',11);
Poner('sepc','****',11);
Poner('vmax','****',11);
Poner('comA','****',11);
Poner('comC','****',11);
Poner('comD','****',11);
Poner('ang','****',11);
Poner('ceo','****',11);
DSelectAll;
SelectObj(C='Texto');
DeleteObjs;
{************* Revisando los datos ***************}
DSelectAll;
SelectObj(C='Sección');
ObjectHD:=FSActLayer;
IF ObjectHD=NIL THEN BEGIN
AlrtDialog('No existe la sección.');
SetVCenter(0,0);
GOTO 1;
END;
b:=HWidth(ObjectHD);
h:=HHeight(ObjectHD);
DSelectAll;
SelectObj(C='Varilla');
vari:=0;
diamp:=0;
ObjectHD:=FSActLayer;
WHILE ObjectHD<>NIL DO BEGIN
vari:=vari+1;
HCenter(ObjectHD,x,y);
coor[vari,1]:=x;
coor[vari,2]:=y;
area1[vari]:=0.78*(HHeight(ObjectHD))^2;
diamp:=diamp+HHeight(ObjectHD);
ObjectHD:=NextSObj(ObjectHD);
END;
diamp:=diamp/vari;
DSelectAll;
SelectObj(C='Varilla');
ObjectHD:=FSActLayer;
IF ObjectHD<>NIL THEN BEGIN
nv:=0;
areat:=0;
FOR i:=1 TO vari DO BEGIN
j:=PtInRect(Coor[i,1],Coor[i,2],0,0,b,h);
IF j THEN BEGIN
nv:=nv+1;
varilla[nv,1]:=Coor[i,1];
varilla[nv,2]:=Coor[i,2];
area[nv]:=area1[i];
areat:=areat+area[nv];
END;
END;
END;
IF nv=0 THEN BEGIN
AlrtDialog('La sección no tiene ninguna varilla.');
SetVCenter(0,0);
GOTO 1;
END;
IF nv>100 THEN BEGIN
AlrtDialog('Las varillas no deben ser más de 100.');
GOTO 1;
END;
FOR i:=1 TO nv DO BEGIN
FOR k:=1 TO nv DO BEGIN
dp:=(sqrt(4*area[i]/3.1416)+sqrt(4*area[k]/3.1416))/2;
s:=sqrt((varilla[i,1]-varilla[k,1])^2+(varilla[i,2]-varilla[k,2])^2);
IF ((s>1.5*dp) AND (s<1.5*agr)) THEN BEGIN
AlrtDialog('Advertencia. La separación entre varillas no cumple con las Normas Técnicas Complementarias.');
GOTO 2;
END;
END;
END;
IF ((ductil<>'SI') AND (ductil<>'NO')) THEN BEGIN
SysBeep;
AlrtDialog('La ductilidad de la estructura deber ser [SI] o [NO].');
GOTO 1;
END;
IF (ductil='NO') THEN BEGIN
FR:=0.8;
amin:=20*b*(h-rec)/fy;
amax:=0.06*b*(h-rec);
IF h/b>4 THEN BEGIN
SysBeep;
AlrtDialog('La relación entre la dimensión transversal mayor de una columna y la menor no excederá de 4.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF ((b<20) OR (h<20)) THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 20 cm.');
AlrtDialog('No cumplir con este requisito viola las Normas Técnicas Complementarias, aunque el programa calculará la resistencia.');
END;
IF areat>amax THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.06.');
GOTO 1;
END;
IF areat<amin THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 20/Fy.');
GOTO 1;
END;
END
ELSE BEGIN
FR:=0.6;
amin:=0.01*b*h;
amax:=0.04*b*h;
IF pu<b*h*fpc/10 THEN BEGIN
SysBeep;
AlrtDialog('La carga Pu no será menor que Agf^c/10.');
j:=YNDialog('Continuar de de todos modos con el cálculo de la resistencia...');
IF j THEN GOTO 4 ELSE GOTO 1;
END;
4:
IF ((b<30) OR (h<30)) THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 30 cm.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF b*h<pu/0.5/fpc THEN BEGIN
SysBeep;
AlrtDialog('El área Ag, no será menor que Pu/0.5f^c para toda combinación de carga.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF ((b/h<0.4) OR (h/b<0.4)) THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el ancho y el peralte de la sección transversal no debe ser menor que 0.4.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF ((lon/h>15) OR (lon/b>15)) THEN BEGIN
SysBeep;
AlrtDialog('La relación entre la altura libre y la menor dimensión transversal no excederá de 15.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF areat>amax THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.04.');
GOTO 1;
END;
IF areat<amin THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 0.01.');
GOTO 1;
END;
IF b>h THEN BEGIN
SysBeep;
AlrtDialog('El ancho de la sección transversal de la columna debe ser menor o igual que el peralte total.');
GOTO 1;
END;
END;
2:
fac:=FR*fpc;
fbc:=fac; {Porque no se usa el rectángulo equivalente}
ex:=100*muy/pu;
ey:=100*mux/pu;
IF ((ex<0.05*h) OR (ex<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad X de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ex:=0.05*h;
IF ex<2 THEN ex:=2;
Poner('muy',Num2Str(0,Pu*ex/100+10),11);
END;
IF ((ey<0.05*h) OR (ey<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad Y de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ey:=0.05*h;
IF ey<2 THEN ey:=2;
Poner('mux',Num2Str(0,Pu*ey/100+10),11);
END;
{fuerzas;}
{Cálculo con la teroría de JAR
Parte del programa que controla el ángulo y profundidad del
eje neutro, así como el valor más cercano a la solución
del problema para secciones rectangulares}
k:=0;
dif:=1000;
ec:=0.003;
e0:=0.002;
ib1:=0;
ih1:=0;
ib2:=4*b/inc;
ih2:=4*h/inc;
3:
k:=k+1;
FOR ii:=1 TO inc DO BEGIN
Message('Porcentaje de avance [Teoría JAR]: ',trunc(ii/inc*100),' %');
FOR jj:=1 TO inc DO BEGIN
bp:=ib1+ii*ib2;
hp:=ih1+jj*ih2;
fuerzas;
dif1:=(abs(exc-ex)+abs(eyc-ey))/(ex+ey);
IF ((dif1<dif) AND (puc>0)) THEN BEGIN
pres:=puc;
eresx:=exc;
eresy:=eyc;
dif:=dif1;
ang:=180/3.1416*Arctan(bp/hp);
ceo:=hp*sin(3.1416/180*ang);
ib3:=bp;
ih3:=hp;
END;
END;
END;
po:=100*areat/(b*h);
Poner('por',Num2Str(2,po),11);
Poner('pmin',Num2Str(2,amin/b/h*100),11);
Poner('pmax',Num2Str(2,amax/b/h*100),11);
Poner('amin',Num2Str(2,amin),11);
Poner('amax',Num2Str(2,amax),11);
Poner('as',Num2Str(2,areat),11);
Poner('prjar',Num2Str(0,pres),11);
IF pres>=pu THEN
Poner('comp','La columna si resiste la compresión',11)
ELSE
Poner('comp','¡¡¡ La columna no resiste la compresión !!!',11);
Poner('mrx',Num2Str(0,pres*eresy/100),11);
Poner('mry',Num2Str(0,pres*eresx/100),11);
Poner('err',Num2Str(2,10*dif),11);
Poner('ang',Num2Str(2,ang),11);
Poner('ceo',Num2Str(2,ceo),11);
{Cálculo con la teroría de Bresler-JAR}
dif:=1000;
ih1:=0;
ih2:=4*h/inc;
bp:=4*b;
FOR ii:=1 TO inc DO BEGIN
Message('Porcentaje de avance [Bresler-JAR]: ',trunc(ii/(2*inc)*100),' %');
hp:=ih1+ii*ih2;
fuerzas;
dif1:=abs(eyc-ey)/(ey^2);
IF ((dif1<dif) AND (puc>0)) THEN BEGIN
prx:=puc;
dif:=dif1;
END;
END;
dif:=1000;
ib1:=0;
ib2:=4*b/inc;
hp:=4*h;
FOR ii:=1 TO inc DO BEGIN
Message('Porcentaje de avance [Bresler-JAR]: ',50+trunc(ii/(2*inc)*100),' %');
bp:=ib1+ii*ib2;
fuerzas;
dif1:=abs(exc-ex)/(ex^2);
IF ((dif1<dif) AND (puc>0)) THEN BEGIN
pry:=puc;
dif:=dif1;
END;
END;
pr0:=b*h*fbc+areat*fy;
prbe:=1/(abs(1/prx)+abs(1/pry)-1/(FR*pr0));
Poner('prbe',Num2Str(0,prbe),11);
Message('Teoría de Bresler simplificado].');
bb:=b;
hh:=h;
xy:=1;
ed:=ey;
Boris;
prx:=puc;
bb:=h;
hh:=b;
xy:=2;
ed:=ex;
Boris;
pry:=puc;
prbs:=FR/(abs(1/prx)+abs(1/pry)-1/pr0);
IF prbs<0.8*prbe THEN prbs:=0.8* prbe;
Poner('prbs',Num2Str(0,prbs),11);
{Revisión por cortante y cálculo de los estribos.}
p:=areat/4/b/(h-rec);
IF (0.7*fbc*h*b+2000*areat)>pu THEN
fact:=1+0.007*pu/b/h
ELSE
fact:=(b*h*0.68*fbc+areat*fy)/pu;
vu:=sqrt(vux^2+vuy^2);
cte:=FR*fact*b*(h-rec)*sqrt(fac);
Vulim:=2*cte;
VcRlim:=1.5*cte;
Poner('vmax',Num2Str(0,Vulim),11);
IF (vu>Vulim) THEN BEGIN
AlrtDialog('No se admite la sección por fuerza cortante.');
GOTO 1;
END;
{Cálculo de la fuerza cortante que toma el concreto.}
IF p<0.01 THEN
VcR:=cte*(0.2+30*p)
ELSE
VcR:=0.5*cte;
IF ((h/b>6) OR (b/h>6)) THEN VcR:=0.7*VcR;
IF ((h>70) OR (b>70)) THEN VcR:=0.7*VcR;
IF VcR>VcRlim THEN VcR:=VcRlim;
{Cálculo de la separación de los estribos.}
s0:=850/sqrt(fy)*diamp;
IF s0<48.*.3175*est THEN s0:=48.*.3175*est;
IF s0<b/2 THEN s0:=b/2;
IF s0<h/2 THEN s0:=h/2;
Av:=2*.0792*est**2;
IF (vu>VcR) THEN s4:=FR*Av*fy*(h-rec)/(vu-VcR);
s1:=FR*Av*fy/(3.5*b);
IF (vu<VcRlim) THEN s2:=0.5*(h-rec);
IF (vu>VcRlim) THEN s3:=0.25*(h-rec);
IF s0/2<s1 THEN s:=s0/2;
IF s2<s THEN s:=s2;
IF s3<s THEN s:=s3;
IF s4<s THEN s:=s4;
IF (ductil='SI') THEN BEGIN
IF s<10 THEN s:=10;
IF s<h/2 THEN s:=h/2;
IF s<b/2 THEN s:=b/2;
END;
IF s<10 THEN s:=10;
Poner('sepc',Num2Str(0,s),11);
has:=b;
IF h>has THEN has:=h;
IF 60>has THEN has:=60;
IF lon/6>has THEN has:=lon/6;
letrero:=Concat('Colocar a partir de los nudos ',Num2Str(0,has/s+1),' estribos # ',Num2Str(0,est),' a cada ',Num2Str(0,s),' cm, después colocarlos a cada ',Num2Str(0,2*s),' cm.');
Poner('comA',letrero,11);
IF ((b>30) OR (h>30)) THEN BEGIN
Poner('comC','Ninguna barra longitudinal que no tenga soporte lateral debe distar más de 15 cm de una',11);
Poner('comD','barra soportada lateralmente. Se recomienda colocar otros estribos o grapas.',11);
END;
Poner('var',num2str(0,nv),11);
Poner('cal',num2str(0,cl),11);
NameClass('Texto');
TextVerticalAlign(1);
FillPat(0);
FillBack(0);
TEXTJUST(1);
TEXTSIZE(12);
TextOrigin(b+15,h);
BeginText;
concat(num2str(0,nv),' # ',num2str(0,cl))
EndText;
TextOrigin(b+15,h-10);
IF est>=3 THEN BEGIN
BeginText;
Concat('Estribos # ',num2str(0,est),' @ ',sep)
EndText;
END
ELSE BEGIN
BeginText;
concat('Estribos de alambrón @ ',sep)
EndText;
END;
NameClass('None');
FechaGenesis(Concat('Fecha',Copy(layername,11,1)),'FT');
END
ELSE IF ((layername='Circular C-1') OR (layername='Circular C-2') OR (layername='Circular C-3')) THEN BEGIN
Numero('fpcC',12,fpc);
Numero('fyC',12,fy);
Numero('recC',12,rec);
Numero('lonC',12,lon);
Numero('estC',12,est);
Numero('agrC',12,agr);
Numero('puC',12,pu);
Numero('muxC',12,mux);
Numero('muyC',12,muy);
Numero('vuxC',12,vux);
Numero('vuyC',12,vuy);
Texto('ductilC',12,ductil);
Numero('calC',12,cl);
Texto('sepeC',12,sep);
Poner('porC','****',12);
Poner('asC','****',12);
Poner('prC','****',12);
Poner('compC','****',12);
Poner('mrC','****',12);
Poner('errC','****',12);
Poner('sepcC','****',12);
Poner('vmaxC','****',12);
Poner('comAC','****',12);
Poner('comCC','****',12);
Poner('comDC','****',12);
Poner('ceoC','****',12);
DSelectAll;
SelectObj(C='Texto');
DeleteObjs;
{************* Revisando los datos ***************}
DSelectAll;
SelectObj(C='Sección');
ObjectHD:=FSActLayer;
IF ObjectHD=NIL THEN BEGIN
AlrtDialog('No existe la sección.');
SetVCenter(0,0);
GOTO 1;
END;
dia:=HWidth(ObjectHD);
DSelectAll;
SelectObj(C='Varilla');
vari:=0;
diamp:=0;
ObjectHD:=FSActLayer;
WHILE ObjectHD<>NIL DO BEGIN
vari:=vari+1;
HCenter(ObjectHD,x,y);
coor[vari,1]:=x;
coor[vari,2]:=y;
area1[vari]:=0.78*(HHeight(ObjectHD))^2;
diamp:=diamp+HHeight(ObjectHD);
ObjectHD:=NextSObj(ObjectHD);
END;
diamp:=diamp/vari;
DSelectAll;
SelectObj(C='Varilla');
ObjectHD:=FSActLayer;
IF ObjectHD<>NIL THEN BEGIN
nv:=0;
areat:=0;
FOR i:=1 TO vari DO BEGIN
j:=PtInRect(Coor[i,1],Coor[i,2],0,0,dia,dia);
IF j THEN BEGIN
nv:=nv+1;
varilla[nv,1]:=Coor[i,1];
varilla[nv,2]:=Coor[i,2];
area[nv]:=area1[i];
areat:=areat+area[nv];
END;
END;
END;
IF nv=0 THEN BEGIN
AlrtDialog('La sección no tiene ninguna varilla.');
SetVCenter(0,0);
GOTO 1;
END;
IF nv>100 THEN BEGIN
AlrtDialog('Las varillas no deben ser más de 100.');
GOTO 1;
END;
FOR i:=1 TO nv DO BEGIN
FOR k:=1 TO nv DO BEGIN
dp:=(sqrt(4*area[i]/3.1416)+sqrt(4*area[k]/3.1416))/2;
s:=sqrt((varilla[i,1]-varilla[k,1])^2+(varilla[i,2]-varilla[k,2])^2);
IF ((s>1.5*dp) AND (s<1.5*agr)) THEN BEGIN
AlrtDialog('Advertencia. La separación entre varillas no cumple con las Normas Técnicas Complementarias.');
GOTO 2;
END;
END;
END;
IF ((ductil<>'SI') AND (ductil<>'NO')) THEN BEGIN
SysBeep;
AlrtDialog('La ductilidad de la estructura deber ser [SI] o [NO].');
GOTO 1;
END;
IF (ductil='NO') THEN BEGIN
FR:=0.8;
amin:=20*(dia^2)*3.1416/4/fy;
amax:=0.06*(dia^2)*3.1416/4;
areasec:=3.1416/4*dia^2;
IF dia<20 THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 20 cm.');
AlrtDialog('No cumplir con este requisito viola las Normas Técnicas Complementarias, aunque el programa calculará la resistencia.');
END;
IF areat>amax THEN BEGIN
Poner('porC',Num2Str(2,areat*100/areasec),12);
Poner('asC',Num2Str(2,areat),12);
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.06. El programa calculará la resistencia pero no cumple con las NTC');
GOTO 2;
END;
IF areat<amin THEN BEGIN
Poner('porC',Num2Str(2,areat*100/areasec),12);
Poner('asC',Num2Str(2,areat),12);
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 20/Fy.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
GOTO 2;
END;
END
ELSE BEGIN
FR:=0.6;
amin:=0.01*(dia^2)*3.1416/4;
amax:=0.04*(dia^2)*3.1416/4;
IF pu<(dia^2)*3.1416/4*fpc/10 THEN BEGIN
SysBeep;
AlrtDialog('La carga Pu no será menor que Agf^c/10.');
GOTO 1;
END;
IF dia<30 THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 30 cm.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
GOTO 2;
END;
IF (dia^2)*3.1416/4<pu/0.5/fpc THEN BEGIN
SysBeep;
AlrtDialog('El área Ag, no será menor que Pu/0.5f^c para toda combinación de carga.');
GOTO 2;
END;
IF (lon/dia>15) THEN BEGIN
SysBeep;
AlrtDialog('La relación entre la altura libre y la menor dimensión transversal no excederá de 15.');
GOTO 2;
END;
IF areat>amax THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.04.');
GOTO 1;
END;
IF areat<amin THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 0.01.');
GOTO 1;
END;
END;
2:
fac:=FR*fpc;
fbc:=fac; {Porque no se usa el rectángulo equivalente}
ex:=100*muy/pu;
ey:=100*mux/pu;
IF ((ex<0.05*dia) OR (ex<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad X de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ex:=0.05*dia;
IF ex<2 THEN ex:=2;
Poner('muyC',Num2Str(0,Pu*ex/100+10),12);
END;
IF ((ey<0.05*dia) OR (ey<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad Y de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ey:=0.05*dia;
IF ey<2 THEN ey:=2;
Poner('muxC',Num2Str(0,Pu*ey/100+10),12);
END;
{Subprograma que controla el ángulo y profundidad del
eje neutro, así como el valor más cercano a la solución
del problema para secciones circulares.}
ec:=0.003;
exy:=sqrt(ex^2+ey^2);
dif:=1000;
ce:=0;
FOR ii:=1 TO 100 DO BEGIN
ce:=ce+0.02;
puc:=0;
mxy:=0;
long:=ce*dia;
t:=dia/2-long;
IF t<0 THEN t:=-t;
IF long>dia THEN t:=dia/2;
alfa:= ArcCos(t/(dia/2));
eyi:=fy/2100000;
FOR i:=1 TO nv DO BEGIN
dis:=long-coor[i,2];
esi:=ec*dis/long;
IF esi>=eyi THEN fs:=fy;
IF ((esi<eyi) AND (esi>(-eyi))) THEN fs:=esi*2100000;
IF esi<=(-eyi) THEN fs:=-fy;
fu:=area[i]*fs;
puc:=puc+fu;
mxy:=mxy+fu*(dia/2-coor[i,2]);
END;
IF long<=dia/2 THEN BEGIN
yc:=dia/3*(sin(alfa))^3/(alfa-sin(alfa)*cos(alfa));
Ac:=dia**2/4*(alfa-sin(alfa)*cos(alfa));
END
ELSE BEGIN
yc:=dia/3*(sin(alfa))^3/(3.1416-alfa+sin(alfa)*cos(alfa));
Ac:=3.1416*dia^2/4-dia^2/4.*(alfa-sin(alfa)*cos(alfa));
END;
puc:=FR*(puc+0.85*Ac*fbc);
mxy:=FR*(mxy+0.85*Ac*fbc*yc);
exyc:=mxy/puc;
dif1:=abs(exyc-exy)/exy;
IF dif1<dif THEN BEGIN
pres:=puc;
ec:=exyc;
dif:=dif1;
ceo:=long;
END;
END;
po:=100*areat/((dia^2)*3.1416/4);
Poner('porC',Num2Str(2,po),12);
Poner('asC',Num2Str(2,areat),12);
Poner('prC',Num2Str(0,pres),12);
IF pres>=pu THEN
Poner('compC','La columna si resiste la compresión',12)
ELSE
Poner('compC','¡¡¡ La columna no resiste la compresión !!!',12);
Poner('mrC',Num2Str(0,pres*ec/100),12);
Poner('muxyC',Num2Str(0,sqrt(mux^2+muy^2)),12);
Poner('errC',Num2Str(2,100*dif),12);
Poner('ceoC',Num2Str(2,ceo),12);
{Revisión por cortante y cálculo de los estribos.}
areac:=(dia^2)*3.1416/4;
p:=areat/4/areac;
IF (0.7*fbc*areac+2000*areat)>pu THEN
fact:=1+0.007*pu/areac
ELSE
fact:=(areac*0.68*fbc+areat*fy)/pu;
vu:=sqrt(vux^2+vuy^2);
cte:=FR*fact*areac*sqrt(fac);
Vulim:=2*cte;
VcRlim:=1.5*cte;
Poner('vmaxC',Num2Str(0,Vulim),12);
IF (vu>Vulim) THEN BEGIN
AlrtDialog('No se admite la sección por fuerza cortante.');
GOTO 1;
END;
{Cálculo de la fuerza cortante que toma el concreto.}
IF p<0.01 THEN
VcR:=cte*(0.2+30*p)
ELSE
VcR:=0.5*cte;
IF dia>70 THEN VcR:=0.7*VcR;
IF VcR>VcRlim THEN VcR:=VcRlim;
{Cálculo de la separación de los estribos.}
s0:=850/sqrt(fy)*diamp;
IF s0<48.*.3175*est THEN s0:=48.*.3175*est;
IF s0<dia/2 THEN s0:=dia/2;
IF s0<dia/2 THEN s0:=dia/2;
Av:=2*.0792*est**2;
IF (vu>VcR) THEN s4:=FR*Av*fy*(dia-rec)/(vu-VcR);
s1:=FR*Av*fy/(3.5*dia);
IF (vu<VcRlim) THEN s2:=0.5*(dia-rec);
IF (vu>VcRlim) THEN s3:=0.25*(dia-rec);
IF s0/2<s1 THEN s:=s0/2;
IF s2<s THEN s:=s2;
IF s3<s THEN s:=s3;
IF s4<s THEN s:=s4;
IF (ductil='SI') THEN BEGIN
IF s<10 THEN s:=10;
IF s<dia/2 THEN s:=dia/2;
IF s<dia/2 THEN s:=dia/2;
END;
IF s<10 THEN s:=10;
Poner('sepcC',Num2Str(0,s),12);
has:=b;
IF dia>has THEN has:=dia;
IF 60>has THEN has:=60;
IF lon/6>has THEN has:=lon/6;
letrero:=Concat('Colocar a partir de los nudos ',Num2Str(0,has/s+1),' estribos # ',Num2Str(0,est),' a cada ',Num2Str(0,s),' cm, después colocarlos a cada ',Num2Str(0,2*s),' cm.');
Poner('comAC',letrero,12);
NameClass('Texto');
FillPat(0);
FillBack(0);
TEXTJUST(1);
TEXTSIZE(12);
TextOrigin(dia+16+cl*2.54/8,dia-12.5+cl*2.54/8);
BeginText;
concat(num2str(0,nv),' # ',num2str(0,cl))
EndText;
TextOrigin(dia+16+cl*2.54/8,dia-22.5+cl*2.54/8);
IF est>=3 THEN BEGIN
BeginText;
Concat('Estribos # ',num2str(0,est),' @ ',sep)
EndText;
END
ELSE BEGIN
BeginText;
concat('Estribos de alambrón @ ',sep)
EndText;
END;
NameClass('None');
FechaGenesis(Concat('FechaC',Copy(layername,12,1)),'FT');
END
ELSE BEGIN
AlrtDialog('El tipo de columna debe ser rectangular o circular. Seleccione la columna adecuada.');
Layer('Columna C-1');
END;
DoMenuTextByName('Fit to Window',0);
1:
DSelectAll;
PopAttrs;
SysBeep;
ClrMessage;
END;
RUN (Bresler);