Any other question that is not specific to an aspect of development or tool can be posted in the General chat forum.
By following these guidelines we make sure that the forums remain easy to read for everybody and also that the right people can find your post to answer it.

Excellent work
And as Heretic said, don't trust a lot at the blueprints, you can use photos (from airliners or jetphotos) for the 3-views, they're very helpful when you'll make the little details![]()

Hint: Texture a single blade and clone it to save some space on the texture map. The blades look all the same anyways.

...this is the correct location thanks to the photograph...


That what I'll be doing with all of them. Would be pretty crazy to have a texture 168 blades on it LOL

Well, you could also combine all the blades into one part and map it as an entire fan "disk".

I looooove your work![]()

On the DC-8-10 to DC-8-40, the reverser system was the same.
There was a sliding "ejector" that slid back on a rail aft of the engine. This was for two purposes, one was sound suppression, the other was that for the thrust reverser to work, the ejector had to be in the aft position.
Inside the ejector was a "daisy" for sound suppression, and two reverser "buckets" or clamshells.
The ejector was 'aft' for takeoff so that reversers could work in the event of a rejected takeoff. Also, the ejectors were 'aft' any time the flaps were extended for sound suppression near the ground, and thus were armed for landing.
The engine pods were different in the DC-8-50, and DC-8-61, then changed again in the DC-8-62/63, then of course when re-engined in the DC-8-70 series.


On the -71's it was possible to deploy the reversers on the inboard engines inflight. I very much remember riding one from Orlando to Denver many years ago and experiencing them being used to "expedite our descent" into Denver.

... I am no master people, I am no expert, I'm just an average guy making some old plane in gMax, I'm nothing to be praised for.![]()

Apparently posting an update at flightsim.com was a bad idea. I came from work today to find my e-mail flooded with all kinds of messages. Some payware teams are asking me to come on-board and join them![]()
I could make the DC8 VC in less than 1 week if I wanted and the cabin as well.

/// CharToNum.h ; 1/22/2011
/// Rafael Perez-Santana (C) 2011
/// mr.rafael.ps@gmail.com
/// CharToNum ALSO PARSES THE <CHAR STRING> (I.E "a4556@#!!78!!2") WILL
/// CONVERT TO "4556782" GIVEN THE TYPE SUPPORTS THE SIZE OF THE OUTPUT.
/// IF YOU GET A PLAIN 0 DURING CONVERSION, TWO EVENTS MAY HAVE OCCURED;
/// 1. YOU CONVERTED A <char string> 0 TO A 0.
/// 2. THE OPERATION WAS ABORTED DUE A TYPE NOT SUPPORTED BY CharToNum.
/// SEE --> @@
#ifndef CHARTONUM_H
#define CHARTONUM_H
#include <cctype> // FOR; isdigit()
#include <cstring> // FOR; strlen(),strcat()
class CharToNum
/// CONVERTS A <char string> TO A NUMBER YOU CAN STORE IN TYPES; SHORT,
/// INT, UNSIGNED INT, LONG, UNSIGNED LONG, LONG LONG & UNSIGNED LONG LONG.
/// :: UNSIGNED SHORT IS RETARDED & NOT RECOMMENDED TO USE WITH CharToNum!!
{
private:
class SupportedTypes
// THIS CLASS HELPS TO IDENTIFY DIFFERENT TYPES.
{ public: /// IF THE TYPE IS NOT SUPPORTED; 0.
operator int() { return 1; }
operator long() { return 1; }
operator short() { return 1; }
operator long long() { return 1; }
operator unsigned int() { return 1; }
operator unsigned long() { return 1; }
operator unsigned long long() { return 1; }
/// THE FOLLOWING TYPES ARE NOT SUPPORTED BY CharToNum.
operator unsigned short() { return 0; }
operator double long() { return 0; }
operator double() { return 0; }
operator float() { return 0; }
} TypeSupport;
char*pNumStr; /// USE .c_str() FOR C++ STRINGS.
unsigned int iMemAlloc; // AMOUNT OF MEMORY TO ALLOCATE.
public:
CharToNum() // :: CONSTRUCTOR.
/// ALLOCATES MEMORY TO STORE THE <char string> THIS WAS DONE SO THAT
/// STRINGS ARE CONCATENATED WHEN THE << OPERATOR IS USED.
{
iMemAlloc=128; // SHOULD BE ENOUGH.
pNumStr=new char[iMemAlloc]; // ALLOCATE THE MEMORY.
if(pNumStr)*pNumStr='0'; // SET FIRST ENTRY TO 0.
}
~CharToNum() // :: DESTRUCTOR.
/// FREES THE ALLOCATED MEMORY.
{
if(pNumStr)delete[]pNumStr; // ONLY FREE IF NOT NULL!
}
// OVERLOAD OPERATOR << TO GET POINTER TO <char string>.
// USAGE: CharToNum YourObject; YourObject<<ACharString; (^_^)
CharToNum&operator<<(const char*pNumStr_)
/// GETS POINTER TO <char string> & STORES LOCATION IN pNumStr.
// IF YOU USE; YourObject<<"123"<<"679"; THE RESULT IS "123679".
{
if(strlen(pNumStr)<iMemAlloc) /// DO NOT EXCEED ALLOCATED MEMORY!
strcat(pNumStr,pNumStr_); // APPEND NEW <char string>
return*this;
}
/// NOTE: EVEN THOUGH << CONCATENATES THE <char strings> TOGETHER, IF THE
/// CONVERSION OUTPUT EXCEEDS THE TYPE MAX LIMIT, YOU MAY NOT GET ALL THE NUMBERS!
// OVERLOAD OPERATOR >> TO INVOKE TYPE CONVERSION TEMPLATE FUNCTION;
// USAGE: int iSomeNumber; YourObject>>iSomeNumber; LOOKS NICER!! (^_^)
template<typename T>CharToNum&operator>>(T&xData)
/// THIS CREATES A TEMPLATE THAT INVOKES YET ANOTHER TEMPLATE, LOL!!
/// IF pNumStr IS NULL, NOTHING HAPPENS, ELSE THE TYPE CONVERSION TO T().
{
if(pNumStr)xData=this->operator T(); // INVOKE TEMPLATE FOR; operator T().
return*this;
}
/// NOTE: IF THE >> OPERATOR IS USED MULTIPLE TIMES;
/// YourObject>>Number1>>Number2>>Number3; THE CONVERSION IS STORED IN
/// Number1 & THEN Number2 EQUALS Number1 & Number3 EQUALS Number2.
// INTERNAL TYPE CONVERSION TEMPLATE FUNCTION; THE HEART OF CharToNum!
template<typename T>operator T()
/// IF THE CONVERSION EXCEEDS THE MAXIMUM ALLOWED MAX LIMIT FOR A TYPE, THE
/// TYPE REVERTS TO 0 OR NEGATIVE, IF THAT HAPPENS, THE CONVERSION OPERATION IS
/// ABORTED AND THE FUNCTION RETURNS THE LAST CONVERSION OPERATION. SEE --> ##
{ T iGetNum=0,iBuffer=0; // TEMPORARY VARIABLES.
T iTYPE=TypeSupport;if(!iTYPE)return iTYPE; /// IF 0 ; TYPE IS NOT SUPPORTED. @@
for(int i=0;*(pNumStr+i)!='\0';i++) // LOOP UNTIL NULL IS FOUND.
{
/// *(NumStr+i) IS CAST TO THE TYPE (T) THE RESULT IS THE char CODE FOR
/// THE NUMBER; char(48 TO 57) REPRESENTS 0,1,2,3,4,5,6,7,8,9. BY SUBRACTING
/// 48 FROM THE char CODE, WE CAN OBTAIN THE ACTUAL NUMBER.
iGetNum=*(pNumStr+i)-48; // CONVERT char CODE TO ACTUAL NUMBER.
if(!isdigit(*(pNumStr+i)))continue; // IGNORE IF NOT A DIGIT.
if(!iBuffer){iBuffer=iGetNum;continue;} // SET TO iGetNum ON FIRST PASS.
// WE MUST CAST THE CONDITION (iBuffer*10+iGetNum) TO THE TYPE (T)!
if(T(iBuffer*10+iGetNum)<iBuffer)break; /// MUST NOT BE LESS, ABORT IF SO! ##
iBuffer=iBuffer*10+iGetNum; // MULTIPLY BY 10 & ADD iGetNum.
/// WARNING! iBuffer=iBuffer*10+iGetNum; MUST BE UNCHANGED!!
/// iBuffer*=10+iGetNum WILL CAUSE 10+iGetNum to EXECUTE FIRST!!
/// YOU DO NOT WANT THAT, iBuffer MUST BE MULTIPLIED BY 10 FIRST
/// BEFORE ADDING iGetNum!!
}
return iBuffer; // iBuffer HAS CONVERSION.
}
};
#endif // CHARTONUM_H
