[V8i - MDL/CPP] Bug in mdlPattern_addAssociative in V8i SS4 (8.11.09.832)

Hi all

We've found a bug in mdlPattern_addAssociative (and in mdlPattern_addAssociative2 as well). If you use code like this:

PatternParams	patPar;

memset(&patPar, 0, sizeof(patPar));
patPar.modifiers |= PATMOD_SPACE1;
patPar.modifiers |= PATMOD_ANGLE1;
patPar.modifiers |= PATMOD_COLOR;
patPar.space1 = 5000;
patPar.angle1 = fc_pi / 4;
patPar.color = 3;

rc = mdlPattern_addAssociative(edPP, 0, 0, &patPar, NULL, NULL, PATTERN_HATCH, mdlModelRef_getActive());

the function returns SUCCESS, BUT at first glance it seems like no pattern have been added to the shape (edPP). But if you use the "Show Pattern Attributes" tool you will se that PA (pattern angle) is zero and PD (pattern distance) is zero as well.

In V8i SS3 this works just fine...

Regards, Evan

Parents
  • edPP is just a parameter (MSElementDescr **edPP) to the function the code snippet is taken from and points to a shape or complex shape. This shape is either selected by the user or found by scanning.

    Regards, Evan
  • I know what edPP is, I'm trying to see exactly what you are doing with it (because the issue almost certainly lies somewhere in your code not mdlPattern_addAssociative, even if you somehow got away with it in a previous version).

    For example, something like the following would be bad:

    void func1()
    {
    MSElementDescrP edP;
    mdlElmdscr_read(&edP, ...);
    func2(edP);
    mdlElmdscr_add(edP);
    mdlElmdscr_freeAll(&edP);
    }
    
    void func2(MSElementDescrP edP)
    {
    func3(&edP);
    }
    
    void func3(MSElementDescrH edPP)
    {
    mdlPattern_addAssociative(edPP, ...);
    }



  • Hi Brien

    I've now created a very small and simple test application that illustrates the problem.

    Private void setSymb(MSElementDescr **edPP, long color)
    {
    	PatternParams	patPar;
    	long			rc;
    
    	memset(&patPar, 0, sizeof(patPar));
    	patPar.modifiers |= PATMOD_SPACE1;
    	patPar.modifiers |= PATMOD_ANGLE1;
    	patPar.modifiers |= PATMOD_COLOR;
    	patPar.space1 = 2000;
    	patPar.angle1 = fc_pi / 4;
    	patPar.color = color;
    
    	rc = mdlPattern_addAssociative(edPP, 0, 0, &patPar, NULL, NULL, PATTERN_HATCH, mdlModelRef_getActive());
    }
    
    
    extern "C" DLLEXPORT int MdlMain (int argc, char **argv)
    {
    	UShort          typeMask[6];
    	ScanCriteria	*scanCriteria;
    	int		scanStatus, scanSize;
    	UInt32		scanPosition;
    	ULong		scanBuf[1024], *lP;
    
    	memset(typeMask, 0, sizeof (typeMask));
    	typeMask[0] = TMSK0_CMPLX_SHAPE | TMSK0_SHAPE | TMSK0_CELL_HEADER;
    	scanCriteria = mdlScanCriteria_create();
    	mdlScanCriteria_setModel(scanCriteria, mdlModelRef_getActive());
    	mdlScanCriteria_setReturnType(scanCriteria, MSSCANCRIT_RETURN_FILEPOS, FALSE, FALSE);
    	mdlScanCriteria_setElementTypeTest(scanCriteria, typeMask, sizeof(typeMask));
    
    	do
    	{
    		scanSize = sizeof(scanBuf) / sizeof(short);
    		scanStatus = mdlScanCriteria_scan(scanCriteria, scanBuf, &scanSize, &scanPosition);
    		for (lP = scanBuf; lP < scanBuf + scanSize / 2; ++lP)
    		{
    			MSElementDescr *edP;
    
    			mdlElmdscr_read(&edP, *lP, mdlModelRef_getActive(), FALSE, NULL);
    			setSymb(&edP, 3);
    			mdlElmdscr_add(edP);
    			mdlElmdscr_freeAll(&edP);
    		}
    	} while (scanStatus == BUFF_FULL);
    
    	if (scanCriteria)
    		mdlScanCriteria_free(scanCriteria);
    
    	return(0);
    }

    Regards, Evan

Reply
  • Hi Brien

    I've now created a very small and simple test application that illustrates the problem.

    Private void setSymb(MSElementDescr **edPP, long color)
    {
    	PatternParams	patPar;
    	long			rc;
    
    	memset(&patPar, 0, sizeof(patPar));
    	patPar.modifiers |= PATMOD_SPACE1;
    	patPar.modifiers |= PATMOD_ANGLE1;
    	patPar.modifiers |= PATMOD_COLOR;
    	patPar.space1 = 2000;
    	patPar.angle1 = fc_pi / 4;
    	patPar.color = color;
    
    	rc = mdlPattern_addAssociative(edPP, 0, 0, &patPar, NULL, NULL, PATTERN_HATCH, mdlModelRef_getActive());
    }
    
    
    extern "C" DLLEXPORT int MdlMain (int argc, char **argv)
    {
    	UShort          typeMask[6];
    	ScanCriteria	*scanCriteria;
    	int		scanStatus, scanSize;
    	UInt32		scanPosition;
    	ULong		scanBuf[1024], *lP;
    
    	memset(typeMask, 0, sizeof (typeMask));
    	typeMask[0] = TMSK0_CMPLX_SHAPE | TMSK0_SHAPE | TMSK0_CELL_HEADER;
    	scanCriteria = mdlScanCriteria_create();
    	mdlScanCriteria_setModel(scanCriteria, mdlModelRef_getActive());
    	mdlScanCriteria_setReturnType(scanCriteria, MSSCANCRIT_RETURN_FILEPOS, FALSE, FALSE);
    	mdlScanCriteria_setElementTypeTest(scanCriteria, typeMask, sizeof(typeMask));
    
    	do
    	{
    		scanSize = sizeof(scanBuf) / sizeof(short);
    		scanStatus = mdlScanCriteria_scan(scanCriteria, scanBuf, &scanSize, &scanPosition);
    		for (lP = scanBuf; lP < scanBuf + scanSize / 2; ++lP)
    		{
    			MSElementDescr *edP;
    
    			mdlElmdscr_read(&edP, *lP, mdlModelRef_getActive(), FALSE, NULL);
    			setSymb(&edP, 3);
    			mdlElmdscr_add(edP);
    			mdlElmdscr_freeAll(&edP);
    		}
    	} while (scanStatus == BUFF_FULL);
    
    	if (scanCriteria)
    		mdlScanCriteria_free(scanCriteria);
    
    	return(0);
    }

    Regards, Evan

Children