<div dir="ltr">Put another way, for SafeDownCast/dynamic_cast to work in this case, the object being pointed to must be allocated and constructed as a Mesh (or a subclass of Mesh).<div><br></div><div>The object in question is being allocated as a vtkPolyData by the file reader. Base classes cannot be converted to derived classes by casting -- when an object is allocated as a vtkPolyData, it will always be a vtkPolyData only, and never a Mesh. This is why the casts are returning NULL -- SafeDownCast checks the object's class name (which is vtkPolyData) and knows that it's not a Mesh, and thus returns NULL. dynamic_cast does the same thing by querying RTTI. In both cases, the PolyData object is not a Mesh as it lacks the additional fields and members that a Mesh would be expected to have, and cannot be safely treated as a Mesh.</div><div><br></div><div>What you probably want to do here instead of casting is construct a Mesh object from the PolyData object. Look at the ShallowCopy and CopyStructure methods of most VTK datasets to see how you can copy the bulk of the PolyData internals into your new Mesh without actually making new copies of the data in memory.<br><div class="gmail_extra"><br></div><div class="gmail_extra">Also, please be sure to "reply to all" when responding to mailing lists -- otherwise the conversation will not be archived or visible to the rest of the list's members.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">HTH</div><div class="gmail_extra">Allie</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 9, 2017 at 5:17 PM, Utkarsh Ayachit <span dir="ltr"><<a href="mailto:utkarsh.ayachit@kitware.com" target="_blank">utkarsh.ayachit@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Maximillian,<div><br></div><div><span style="font-size:12.8px">> <i>a downcast is required in order to convert a vtkPolyData object into a </i></span><i><b style="font-size:12.8px">Mesh</b><span style="font-size:12.8px"> object</span></i><br></div><div><i><span style="font-size:12.8px"><br></span></i></div><div><span style="font-size:12.8px">Not true. A downcast is required to convert a <b>pointer</b> of type vtkPolyData to <b>pointer</b> of type Mesh, but it need not succeed i.e. return non-null. The cast will only succeed if the the object pointed to via the vtkPolyData pointer is indeed of type Mesh. vtkSTLReader will never create Mesh, it will only create vtkPolyData. As a result you cannot "downcast" it to Mesh with success.</span></div><div><br></div><div>> <i>why do dynamic_cast work just fine whereas SafeDownCast don‘t</i><br></div><div><i><br></i></div><div>Hopefully the attached C++ code helps.<br></div><div><div><br></div></div><div>Utkarsh<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 9, 2017 at 4:23 PM, Maximilian Weiherer <span dir="ltr"><<a href="mailto:weiherer.maximilian@gmx.de" target="_blank">weiherer.maximilian@gmx.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="DE"><div class="gmail-m_-7316977232920517543m_1447988832858569916WordSection1"><p class="MsoNormal">Hi Utkarsh, <u></u><u></u></p><p class="MsoNormal">as <b>Mesh</b> <i>is a</i> vtkPolyData, a downcast is required in order to convert a vtkPolyData object into a <b>Mesh</b> object. I still don’t know why SafeDownCast do not work properly. As far as I know, the parent class (vtkPolyData) must be downcasted to <b>Mesh</b>… . If a dynamic_cast is essentially the same as SafeDownCast, why do dynamic_cast work just fine whereas SafeDownCast don‘t?<u></u><u></u></p><p class="MsoNormal">Best regards<br>Maximilian<u></u><u></u></p><p class="MsoNormal"><span><b>Von:</b> Utkarsh Ayachit [mailto:<a href="mailto:utkarsh.ayachit@kitware.com" target="_blank">utkarsh.ayachit@kitwar<wbr>e.com</a>] <br></span><b>Gesendet:</b> Mittwoch, 9. August 2017 20:33<br><b>An:</b> Maximilian Weiherer <<a href="mailto:weiherer.maximilian@gmx.de" target="_blank">weiherer.maximilian@gmx.de</a>>; ParaView <<a href="mailto:paraview@paraview.org" target="_blank">paraview@paraview.org</a>></p><div><div class="gmail-m_-7316977232920517543h5"><br><b>Betreff:</b> Re: [vtkusers] SafeDownCast does not work properly<u></u><u></u></div></div><p></p><div><div class="gmail-m_-7316977232920517543h5"><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal"><span style="font-size:9.5pt">Maximilian,</span><u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-size:9.5pt">That's not a reasonable expectation. Mesh **isa** vtkPolyData, and not vice-versa. Look at docs for dynamic_cast in C++. In spirit, SafeDownCast is essentially the same thing.</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-size:9.5pt">Utkarsh</span><u></u><u></u></p></div></div><div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">On Wed, Aug 9, 2017 at 2:12 PM, Maximilian Weiherer <<a href="mailto:weiherer.maximilian@gmx.de" target="_blank">weiherer.maximilian@gmx.de</a>> wrote:<u></u><u></u></p><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm"><div><div><p class="MsoNormal">Hi Utkarsh, <u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal">thanks for your reply. I created the custom mesh class in order to add some new functionality (e.g. a method to check whether a mesh intersects another mesh). The vtkPolyData object which should be casted is the output of a vtkSTLReader, i.e. <u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* mesh = </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">::SafeDownCast(reader->Get<wbr>Output()); </span><span style="font-size:9.5pt;font-family:Consolas;color:green">// mesh always equals NULL</span><u></u><u></u></p><p class="MsoNormal">Best regards<u></u><u></u></p><p class="MsoNormal">Maximilian<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal"><b>Von:</b> Utkarsh Ayachit [mailto:<a href="mailto:utkarsh.ayachit@kitware.com" target="_blank">utkarsh.ayachit@kitwar<wbr>e.com</a>] <br><b>Gesendet:</b> Mittwoch, 9. August 2017 17:53<br><b>An:</b> Maximilian Weiherer <<a href="mailto:weiherer.maximilian@gmx.de" target="_blank">weiherer.maximilian@gmx.de</a>><br><b>Cc:</b> vtk <<a href="mailto:vtkusers@vtk.org" target="_blank">vtkusers@vtk.org</a>><br><b>Betreff:</b> Re: [vtkusers] SafeDownCast does not work properly<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal"><span style="font-size:9.5pt">Maximilian,</span><u></u><u></u></p><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:9.5pt">I am confused why any arbitrary vtkPolyData object would be castable to "Mesh". It will only return non-null, if it's is indeed created as a Mesh. Is it? Where's the "<vtkPolyData object>" coming from?</span><u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-size:9.5pt">Utkarsh</span><u></u><u></u></p></div></div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Wed, Aug 9, 2017 at 11:50 AM, Maximilian Weiherer <<a href="mailto:weiherer.maximilian@gmx.de" target="_blank">weiherer.maximilian@gmx.de</a>> wrote:<u></u><u></u></p><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin:5pt 0cm 5pt 4.8pt"><div><div><p class="MsoNormal">Hi all, <u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal">I defined my own mesh class (named <b>Mesh</b>) by inheriting from vtkPolyData. Now I am struggling with the SafeDownCast method in order to cast a vtkPolyData object into a <b>Mesh</b> object. Whenever I am applying a SafeDownCast to a vtkPolyData object, NULL is returned.<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal">The <b>Mesh</b> class looks as follows:<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:blue">class</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> : </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">public</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">vtkPolyData</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">{</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">  </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">public</span><span style="font-size:9.5pt;font-family:Consolas;color:black">:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">    </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">static</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* New();</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">    </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(111,0,138)">vtkTypeMacro</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">, </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">vtkPolyData</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">    </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> PrintSelf(</span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">ostream</span><span style="font-size:9.5pt;font-family:Consolas;color:black">& </span><span style="font-size:9.5pt;font-family:Consolas;color:gray">os</span><span style="font-size:9.5pt;font-family:Consolas;color:black">, </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">vtkIndent</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><span style="font-size:9.5pt;font-family:Consolas;color:gray">indent</span><span style="font-size:9.5pt;font-family:Consolas;color:black">);</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">  </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">protected</span><span style="font-size:9.5pt;font-family:Consolas;color:black">:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">    Mesh();</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">    ~Mesh();</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">  </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">private</span><span style="font-size:9.5pt;font-family:Consolas;color:black">:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">    Mesh(</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">&); </span><span style="font-size:9.5pt;font-family:Consolas;color:green">// Not implemented.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">    </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><span style="font-size:9.5pt;font-family:Consolas;color:teal">operator=</span><span style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span style="font-size:9.5pt;font-family:Consolas;color:blue">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">&); </span><span style="font-size:9.5pt;font-family:Consolas;color:green">// Not implemented.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black">};</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><u></u><u></u></p><p class="MsoNormal"><span style="color:black">…and this is the cast that does not work properly:</span><u></u><u></u></p><p class="MsoNormal"><span style="color:black"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">* mesh = </span><span style="font-size:9.5pt;font-family:Consolas;color:rgb(43,145,175)">Mesh</span><span style="font-size:9.5pt;font-family:Consolas;color:black">::SafeDownCast(<vtkPolyDat<wbr>a object>); </span><span style="font-size:9.5pt;font-family:Consolas;color:green">// mesh always equals NULL</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:green"> </span><u></u><u></u></p><p class="MsoNormal"><span style="color:black">Any help would be appreciated. Thanks!</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black"> </span><u></u><u></u></p><p class="MsoNormal">Best regards<u></u><u></u></p><p class="MsoNormal">Maximilian<u></u><u></u></p></div><div id="gmail-m_-7316977232920517543m_1447988832858569916m_5834314892408756603m_3987841914009693506DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><p class="MsoNormal"> <u></u><u></u></p><table class="gmail-m_-7316977232920517543m_1447988832858569916MsoNormalTable" border="1" cellpadding="0" style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(211,212,222)"><tbody><tr><td width="55" style="width:41.25pt;border:none;padding:13.5pt 0.75pt 0.75pt"><p class="MsoNormal"><a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient" target="_blank"><span style="border:1pt solid windowtext;padding:0cm;text-decoration:none"><img border="0" width="46" height="29" style="width: 0.4791in; height: 0.302in;" id="gmail-m_-7316977232920517543m_1447988832858569916m_5834314892408756603_x005f_x0000_i1025" src="cid:image001.jpg@01D3115C.B8B13140" alt="Das Bild wurde vom Absender entfernt."></span></a><u></u><u></u></p></td><td width="470" style="width:352.5pt;border:none;padding:12.75pt 0.75pt 0.75pt"><p class="MsoNormal" style="line-height:13.5pt"><span style="font-size:10pt;font-family:Arial,sans-serif;color:rgb(65,66,78)">Virenfrei. <a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient" target="_blank"><span style="color:rgb(68,83,234)">www.avast.com</span></a> </span><u></u><u></u></p></td></tr></tbody></table></div></div><p class="MsoNormal" style="margin-bottom:12pt"><br>______________________________<wbr>_________________<br>Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br><br>Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensou<wbr>rce/opensource.html</a><br><br>Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FA<wbr>Q</a><br><br>Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" target="_blank">http://markmail.org/search/?q=<wbr>vtkusers</a><br><br>Follow this link to subscribe/unsubscribe:<br><a href="http://public.kitware.com/mailman/listinfo/vtkusers" target="_blank">http://public.kitware.com/mail<wbr>man/listinfo/vtkusers</a><u></u><u></u></p></blockquote></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></blockquote></div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div></div></blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/<wbr>opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_<wbr>FAQ</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=<wbr>vtkusers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/<wbr>mailman/listinfo/vtkusers</a><br>
<br></blockquote></div><br></div></div></div>